NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #320 most downloaded on PyPI
Python bindings for 0MQ
Last release 1 months ago
20 Aug 2026
Ships unpredictably
gaps range from 2 weeks to 12 months
Most releases are documented
notes for 44 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
16 years old
107 releases · first in 2010
- Fix compatibility with tornado 6 (removal of stack_context)
Fix compatibility with tornado 6 (removal of stack_context)
- Fix possible hang when working with asyncio
Fix possible hang when working with asyncio
Remove some outdated workarounds for old Cython versions
Fix some compilation with custom compilers
Remove unneeded link of libstdc++ on PyPy
One column per quarter.
Nothing published for this version
- Improve tornado 5.0 compatibility (use current() instead of instance() to get default loops in ZMQStream and .IOLoopAuthenticator )
Bump bundled libzmq to 4.2.5
Improve tornado 5.0 compatibility (use current() instead of instance() to get default loops in ZMQStream and .IOLoopAuthenticator )
Add support for curve_public()
Remove delayed import of json in send/recv_json
Add Authenticator.configure_curve_callback()
Various build fixes
sdist sources generated with Cython 0.28.3
Stop building wheels for Python 3.4, start building wheels for Python 3.7
~tornado.ioloop.IOLoop.current instead of {meth}~tornado.ioloop.IOLoop.instance
to get default loops in {class}.ZMQStream and .IOLoopAuthenticator).curve_publicsend/recv_json.Authenticator.configure_curve_callback- Added visible deprecation warnings to bundled tornado IOLoop. Tornado eventloop integration shouldn’t be used without a proper tornado install since…
Add zmq.Socket.send_serialized() and zmq.Socket.recv_serialized() for sending/receiving messages with custom serialization.
Add zmq.Socket.copy_threshold and zmq.COPY_THRESHOLD . Messages smaller than this are always copied, regardless of copy=False , to avoid overhead of zero-copy bookkeeping on small messages.
Added visible deprecation warnings to bundled tornado IOLoop. Tornado eventloop integration shouldn’t be used without a proper tornado install since pyzmq 14.
Allow pyzmq asyncio/tornado integration to run without installing zmq_poll implementation. The following methods and classes are deprecated and no longer required:
zmq.eventloop.ioloop.install
zmq.eventloop.ioloop.IOLoop
zmq.asyncio.install
zmq.asyncio.ZMQEventLoop
Set RPATH correctly when building on macOS.
Compatibility fixes with tornado 5.0.dev (may not be quite enough for 5.0 final, which is not yet released as of pyzmq 17).
Draft support for CLIENT-SERVER routing_id and group .
See also
Working with libzmq DRAFT sockets
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
- Add warning when using bundled tornado, which was deprecated too quietly in 14.x.
Regenerate Cython sources in sdists with Cython 0.27.3, fixing builds on CPython 3.7.
Add warning when using bundled tornado, which was deprecated too quietly in 14.x.
- Regenerate Cython sources in sdists with Cython 0.27.2, fixing builds on CPython 3.7.
Regenerate Cython sources in sdists with Cython 0.27.2, fixing builds on CPython 3.7.
- Workaround bug in libzmq-4.2.0 causing EINVAL on poll.
Workaround bug in libzmq-4.2.0 causing EINVAL on poll.
- Fix erroneous EAGAIN that could happen on async sockets
Fix erroneous EAGAIN that could happen on async sockets
Bundle libzmq 4.1.6
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
- Update bundled libzmq to 4.1.2.
Changes:
Update bundled libzmq to 4.1.2.
Following the lead of Python 3.5 , interrupted system calls will be retried.
Fixes:
Fixes for CFFI backend on Python 3 + support for PyPy 3.
Verify types of all frames in send_multipart() before sending, to avoid partial messages.
Fix build on Windows when both debug and release versions of libzmq are found.
Windows build fixes for Python 3.5.
- improvements in zmq.Socket.bind_to_random_port() : : - use system to allocate ports by default
Changes:
improvements in zmq.Socket.bind_to_random_port() : : - use system to allocate ports by default
catch EACCES on Windows
include libsodium when building bundled libzmq on Windows (includes wheels on PyPI)
pyzmq no longer bundles external libzmq when making a bdist. You can use delocate to do this.
Bugfixes:
add missing ndim on memoryviews of Frames
allow copy.copy() and copy.deepcopy() on Sockets, Contexts
Changes:
zmq.Socket.bind_to_random_port:
: - use system to allocate ports by default
Bugfixes:
ndim on memoryviews of Framescopy.copy and {func}copy.deepcopy on Sockets, Contexts- use pickle.DEFAULT_PROTOCOL by default in send_pickle
Changes:
use pickle.DEFAULT_PROTOCOL by default in send_pickle
with the release of pip-6, OS X wheels are only marked as 10.6-intel, indicating that they should be installable on any newer or single-arch Python.
raise SSHException on failed check of host key
Bugfixes:
fix method name in utils.wi32.allow_interrupt
fork-related fixes in garbage collection thread
add missing import in zmq.init , causing failure to import in some circumstances
- SyntaxError on Python 2.6 in zmq.ssh
Bugfixes for 14.4
SyntaxError on Python 2.6 in zmq.ssh
Handle possible bug in garbage collection after fork
- Experimental support for libzmq-4.1.0 rc (new constants, plus zmq.has() ).
New features:
Experimental support for libzmq-4.1.0 rc (new constants, plus zmq.has() ).
Update bundled libzmq to 4.0.5
Update bundled libsodium to 1.0.0
Fixes for SSH dialogs when using zmq.ssh.tunnel to create tunnels
More build/link/load fixes on OS X and Solaris
Get Frame metadata via dict access (libzmq 4)
Contexts and Sockets are context managers (term/close on exit )
Add zmq.utils.win32.allow_interrupt context manager for catching SIGINT on Windows
Bugs fixed:
Bundled libzmq should not trigger recompilation after install on PyPy
pyzmq-14.3.1 is the last version to include bdists for Python 3.3
Note
pyzmq-14.3.1 is the last version to include bdists for Python 3.3
Minor bugfixes to pyzmq 14.3:
Fixes to building bundled libzmq on OS X < 10.9
Fixes to import-failure warnings on Python 3.4
Fixes to tests
Pull upstream fixes to zmq.ssh for ssh multiplexing
- PyZMQ no longer calls Socket.close() or Context.term() during process cleanup. Changes to garbage collection in Python 3.4 make this impossible to d
PyZMQ no longer calls Socket.close() or Context.term() during process cleanup. Changes to garbage collection in Python 3.4 make this impossible to do sensibly.
ZMQStream.close() closes its socket immediately, rather than scheduling a timeout.
Raise the original ImportError when importing zmq fails. Should be more informative than no module cffi... .
Warning
Users of Python 3.4 should not use pyzmq < 14.3, due to changes in garbage collection.
.Socket.close or {meth}.Context.term during process cleanup.
Changes to garbage collection in Python 3.4 make this impossible to do sensibly..ZMQStream.close closes its socket immediately, rather than scheduling a timeout.no module cffi....Users of Python 3.4 should not use pyzmq \< 14.3, due to changes in garbage collection.
- Raise new ZMQVersionError when a requested method is not supported by the linked libzmq. For backward compatibility, this subclasses NotImplementedE
Raise new ZMQVersionError when a requested method is not supported by the linked libzmq. For backward compatibility, this subclasses NotImplementedError.
Memory leak introduced in pyzmq-14.0 in zero copy.
OverflowError on 32 bit systems in zero copy.
Fixes installation problem on PyPy introduced in 14.1.0.
Fixes installation problem on PyPy introduced in 14.1.0.
Minor release of pyzmq, mainly adding better support for zeromq's security
Minor release of pyzmq, mainly adding better support for zeromq's security
zmq.authSee the changelog for details.
The headline features for 14.1 are adding better support for libzmq’s security features.
When libzmq is bundled as a Python extension (e.g. wheels, eggs), libsodium is also bundled (excluding Windows), ensuring that libzmq security is available to users who install from wheels
New zmq.auth , implementing zeromq’s ZAP authentication, modeled on czmq zauth. For more information, see the examples .
Add PYZMQ_BACKEND for enabling use of backends outside the pyzmq codebase.
Add underlying property and shadow() method to Context and Socket, for handing off sockets and contexts. between pyzmq and other bindings (mainly pyczmq ).
Add TOS, ROUTER_HANDOVER, and IPC_FILTER constants from libzmq-4.1-dev.
Add Context option support in the CFFI backend.
Various small unicode and build fixes, as always.
send_json() and recv_json() pass any extra kwargs to json.dumps/loads .
Socket.socket_type is deprecated, in favor of Socket.type , which has been available since 2.1.
The headline features for 14.1 are adding better support for libzmq's security features.
zmq.auth, implementing zeromq's ZAP authentication,
modeled on czmq zauth.
For more information, see the examples.~.Context.underlying property and {meth}~.Context.shadow
method to Context and Socket, for handing off sockets and contexts.
between pyzmq and other bindings (mainly [pyczmq]).~.Socket.send_json and {meth}~.Socket.recv_json pass any extra kwargs to json.dumps/loads.Socket.socket_type is deprecated, in favor of Socket.type,
which has been available since 2.1.14.0.1 is a bugfix release, mainly fixing some bugs in garbage collection and process cleanup.
14.0.1 is a bugfix release, mainly fixing some bugs in garbage collection and process cleanup.
It also bumps the bundled libzmq to 4.0.3.
Bugfix release
Update bundled libzmq to current (4.0.3).
Fix bug in Context.destroy() with no open sockets.
Threadsafety fixes in the garbage collector.
Python 3 fixes in zmq.ssh.tunnel .
Bugfix release
.Context.destroy with no open sockets.zmq.ssh.tunnel.pyzmq 14.0 adds support for libzmq-4.0, including socket monitoring and security.
pyzmq 14.0 adds support for libzmq-4.0, including socket monitoring and security.
See changelog for details.
Update bundled libzmq to current (4.0.1).
Backends are now implemented in zmq.backend instead of zmq.core . This has no effect on public APIs.
Various build improvements for Cython and CFFI backends (PyPy compiles at build time).
Various GIL-related performance improvements - the GIL is no longer touched from a zmq IO thread.
Adding a constant should now be a bit easier - only zmq/sugar/constant_names should need updating, all other constant-related files should be automatically updated by setup.py constants .
add support for latest libzmq-4.0.1 (includes ZMQ_CURVE security and socket event monitoring).
Socket.monitor()
Socket.get_monitor_socket()
zmq.curve_keypair()
zmq.utils.monitor
zmq.utils.z85
zmq.backend instead of zmq.core.
This has no effect on public APIs.setup.py constants..Socket.monitor.Socket.get_monitor_socketzmq.curve_keypairzmq.utils.monitorzmq.utils.z85The main new feature is improved tornado 3 compatibility. PyZMQ ships a ‘minitornado’ submodule, which contains a small subset of tornado 3.0.1, in or
The main new feature is improved tornado 3 compatibility. PyZMQ ships a ‘minitornado’ submodule, which contains a small subset of tornado 3.0.1, in order to get the IOLoop base class. zmq.eventloop.ioloop.IOLoop is now a simple subclass, and if the system tornado is ≥ 3.0, then the zmq IOLoop is a proper registered subclass of the tornado one itself, and minitornado is entirely unused.
- FIXED we used totally deprecated ctypes_configure to generate constants in CFFI backend
Bugfix release!
A few things were broken in 13.0.0, so this is a quick bugfix release.
FIXED EAGAIN was unconditionally turned into KeyboardInterrupt
FIXED we used totally deprecated ctypes_configure to generate constants in CFFI backend
FIXED memory leak in CFFI backend for PyPy
FIXED typo prevented IPC_PATH_MAX_LEN from ever being defined
FIXED various build fixes - linking with librt, Cython compatibility, etc.
defunct bugfix. We do not speak of this…
defunct bugfix. We do not speak of this…
PyZMQ now officially targets libzmq-3 (3.2.2), 0MQ ≥ 2.1.4 is still supported for the indefinite future, but 3.x is recommended. PyZMQ has detached fr
PyZMQ now officially targets libzmq-3 (3.2.2), 0MQ ≥ 2.1.4 is still supported for the indefinite future, but 3.x is recommended. PyZMQ has detached from libzmq versioning, and will just follow its own regular versioning scheme from now on. PyZMQ bdists will include whatever is the latest stable libzmq release (3.2.2 for pyzmq-13.0).
Note
set/get methods are exposed via get/setattr on all Context, Socket, and Frame classes. This means that subclasses of these classes that require extra attributes must declare these attributes at the class level .
The Threadsafe ZMQStream experiment in 2.2.0.1 was deemed inappropriate and not useful, and has been removed.
The zmq.web experiment has been removed, to be developed as a standalone project .
Support for PyPy via CFFI backend (requires py, ctypes-configure, and cffi).
Add support for new APIs in libzmq-3
Socket.disconnect()
Socket.unbind()
Context.set()
Context.get()
Frame.set()
Frame.get()
zmq.proxy()
zmq.devices.Proxy
Exceptions for common zmq errnos: zmq.Again , zmq.ContextTerminated (subclass ZMQError , so fully backward-compatible).
Setting and getting Socket.hwm sets or gets both SNDHWM/RCVHWM for libzmq-3.
Implementation splits core Cython bindings from pure-Python subclasses with sugar methods (send/recv_multipart). This should facilitate non-Cython backends and PyPy support [spoiler: it did!].
Unicode fixes in log and monitored queue
MinGW, ppc, cross-compilation, and HP-UX build fixes
zmq.green should be complete - devices and tornado eventloop both work in gevent contexts.
PyZMQ now officially targets libzmq-3 (3.2.2), 0MQ ≥ 2.1.4 is still supported for the indefinite future, but 3.x is recommended. PyZMQ has detached from libzmq versioning, and will just follow its own regular versioning scheme from now on. PyZMQ bdists will include whatever is the latest stable libzmq release (3.2.2 for pyzmq-13.0).
set/get methods are exposed via get/setattr on all Context, Socket, and Frame classes.
This means that subclasses of these classes that require extra attributes
**must declare these attributes at the class level**.
zmq.web experiment has been removed,
to be developed as a standalone project.Support for PyPy via CFFI backend (requires py, ctypes-configure, and cffi).
Add support for new APIs in libzmq-3
.Socket.disconnect.Socket.unbind.Context.set.Context.get.Frame.set.Frame.getzmq.proxyzmq.devices.Proxyzmq.Again, {class}zmq.ContextTerminated
(subclass {class}~.ZMQError, so fully backward-compatible).Setting and getting {attr}.Socket.hwm sets or gets both SNDHWM/RCVHWM for libzmq-3.
Implementation splits core Cython bindings from pure-Python subclasses with sugar methods (send/recv_multipart). This should facilitate non-Cython backends and PyPy support [spoiler: it did!].
zmq.green should be complete - devices and tornado eventloop both work
in gevent contexts.This is a tech-preview release, to try out some new features. It is expected to be short-lived, as there are likely to be issues to iron out, particul
This is a tech-preview release, to try out some new features. It is expected to be short-lived, as there are likely to be issues to iron out, particularly with the new pip-install support.
These features are marked ‘experimental’, which means that their APIs are not set in stone, and may be removed or changed in incompatible ways in later releases.
With the IOLoop inherited from tornado, there is exactly one method that is threadsafe: add_callback() . With this release, we are trying an experimental option to pass all IOLoop calls via this method, so that ZMQStreams can be used from one thread while the IOLoop runs in another. To try out a threadsafe stream:
stream = ZMQStream ( socket , threadsafe = True )
PyZMQ should now be pip installable, even on systems without libzmq. In these cases, when pyzmq fails to find an appropriate libzmq to link against, it will try to build libzmq as a Python extension. This work is derived from pyzmq_static .
To this end, PyZMQ source distributions include the sources for libzmq (2.2.0) and libuuid (2.21), both used under the LGPL.
The excellent gevent_zeromq socket subclass which provides gevent compatibility has been merged as zmq.green .
See also
zmq.green
TIMEO sockopts are properly included for libzmq-2.2.0
avoid garbage collection of sockets after fork (would cause assert (mailbox.cpp:79) ).
- ZMQStream on_err() is deprecated, because it never did anything.
Some effort has gone into refining the pyzmq API in this release to make it a model for other language bindings. This is principally made in a few renames of objects and methods, all of which leave the old name for backwards compatibility.
Note
As of this release, all code outside zmq.core is BSD licensed (where possible), to allow more permissive use of less-critical code and utilities.
The Message class has been renamed to Frame , to better match other zmq bindings. The old Message name remains for backwards-compatibility. Wherever pyzmq docs say “Message”, they should refer to a complete zmq atom of communication (one or more Frames, connected by ZMQ_SNDMORE). Please report any remaining instances of Message==MessagePart with an Issue (or better yet a Pull Request).
All foo_unicode methods are now called foo_string ( _unicode remains for backwards compatibility). This is not only for cross-language consistency, but it makes more sense in Python 3, where native strings are unicode, and the _unicode suffix was wedded too much to Python 2.
prefix removed as an unused keyword argument from send_multipart() .
ZMQStream send() default has been changed to copy=True , so it matches Socket send() .
ZMQStream on_err() is deprecated, because it never did anything.
Python 2.5 compatibility has been dropped, and some code has been cleaned up to reflect no-longer-needed hacks.
Some Cython files in zmq.core have been split, to reduce the amount of Cython-compiled code. Much of the body of these files were pure Python, and thus did not benefit from the increased compile time. This change also aims to ease maintaining feature parity in other projects, such as pyzmq-ctypes .
Context objects can now set default options when they create a socket. These are set and accessed as attributes to the context. Socket options that do not apply to a socket (e.g. SUBSCRIBE on non-SUB sockets) will simply be ignored.
on_recv_stream() has been added, which adds the stream itself as a second argument to the callback, making it easier to use a single callback on multiple streams.
A Frame.more boolean attribute has been added to the Frame (née Message) class, so that frames can be identified as terminal without extra queries of Socket.rcvmore .
These features are marked ‘experimental’, which means that their APIs are not set in stone, and may be removed or changed in incompatible ways in later releases.
zmq.web added for load-balancing requests in a tornado webapp with zeromq.
- remove support for LABEL prefixes. A major feature of libzmq-3.0, the LABEL prefix, has been removed from libzmq, prior to the first stable libzmq 3
remove support for LABEL prefixes. A major feature of libzmq-3.0, the LABEL prefix, has been removed from libzmq, prior to the first stable libzmq 3.x release.
The prefix argument to send_multipart() remains, but it continue to behave in exactly the same way as it always has on 2.1.x, simply prepending message parts.
recv_multipart() will always return a list, because prefixes are once again indistinguishable from regular message parts.
add zmq.Socket.poll() method, for simple polling of events on a single socket.
no longer require monkeypatching tornado IOLoop. The ioloop.ZMQPoller class is a poller implementation that matches tornado’s expectations, and pyzmq sockets can be used with any tornado application just by specifying the use of this poller. The pyzmq IOLoop implementation now only trivially differs from tornado’s.
It is still recommended to use ioloop.install() , which sets both the zmq and tornado global IOLoop instances to the same object, but it is no longer necessary.
Warning
The most important part of this change is that the IOLoop.READ/WRITE/ERROR constants now match tornado’s, rather than being mapped directly to the zmq POLLIN/OUT/ERR . So applications that used the low-level IOLoop.add_handler code with POLLIN/OUT/ERR directly (used to work, but was incorrect), rather than using the IOLoop class constants will no longer work. Fixing these to use the IOLoop constants should be insensitive to the actual value of the constants.
- Add support for libzmq-3.0 LABEL prefixes:
Add support for libzmq-3.0 LABEL prefixes:
Warning
This feature has been removed from libzmq, and thus removed from future pyzmq as well.
send a message with label-prefix with:
send_multipart ([ b "msg" , b "parts" ], prefix = [ b "label" , b "prefix" ])
zmq.Socket.recv_multipart() returns a tuple of (prefix,msg) if a label prefix is detected
ZMQStreams and devices also respect the LABEL prefix
add czmq-style close&term as zmq.Context.destroy() , so that zmq.Context.term() remains threadsafe and 1:1 with libzmq.
zmq.Socket.close() takes optional linger option, for setting linger prior to closing.
add zmq_version_info() and pyzmq_version_info() for getting libzmq and pyzmq versions as tuples of numbers. This helps with the fact that version string comparison breaks down once versions get into double-digits.
ioloop changes merged from upstream Tornado 2.1
Add support for libzmq-3.0 LABEL prefixes:
This feature has been removed from libzmq, and thus removed from future pyzmq
as well.
send a message with label-prefix with:
send_multipart([b"msg", b"parts"], prefix=[b"label", b"prefix"])
{meth}zmq.Socket.recv_multipart returns a tuple of (prefix,msg) if a label prefix is detected
ZMQStreams and devices also respect the LABEL prefix
add czmq-style close&term as {meth}zmq.Context.destroy, so that {meth}zmq.Context.term
remains threadsafe and 1:1 with libzmq.
{meth}zmq.Socket.close takes optional linger option, for setting linger prior
to closing.
add {func}~.zmq_version_info and
{func}~.pyzmq_version_info for getting libzmq and pyzmq versions as
tuples of numbers. This helps with the fact that version string comparison breaks down
once versions get into double-digits.
ioloop changes merged from upstream Tornado 2.1
- added zmq.ssh tools for tunneling socket connections, copied from IPython
added zmq.ssh tools for tunneling socket connections, copied from IPython
Expanded sockopt support to cover changes in libzmq-4.0 dev.
Fixed an issue that prevented KeyboardInterrupt from being catchable.
Added attribute-access for set/getsockopt. Setting/Getting attributes of Socket s with the names of socket options is mapped to calls of set/getsockopt.
s . hwm = 10 s . identity = b "whoda" s . linger # -1
Terminating a Context closes the sockets it created, matching the behavior in czmq .
ThreadDevice s use zmq.Context.instance() to create sockets, so they can use inproc connections to sockets in other threads.
fixed units error on zmq.select() , where the poll timeout was 1000 times longer than expected.
Add missing DEALER/ROUTER socket type names (currently aliases, to be replacements for XREP/XREQ ).
base libzmq dependency raised to 2.1.4 (first stable release) from 2.1.0.
KeyboardInterrupt from being catchable.~.zmq.Sockets
with the names of socket options is mapped to calls of set/getsockopt.s.hwm = 10
s.identity = b"whoda"
s.linger
# -1
~.zmq.Context closes the sockets it created, matching the behavior in
czmq..ThreadDevices use {meth}.zmq.Context.instance to create sockets, so they can use
inproc connections to sockets in other threads.zmq.select, where the poll timeout was 1000 times longer
than expected.DEALER/ROUTER socket type names (currently aliases, to be replacements for XREP/XREQ).- Added experimental support for libzmq-3.0 API
Added experimental support for libzmq-3.0 API
Add zmq.eventloop.ioloop.install for using pyzmq’s IOLoop in a tornado application.
- First version with binary distribution support
First version with binary distribution support
Added zmq.Context.instance() method for using a single Context throughout an application without passing references around.
On this page
Show Source
zmq.Context.instance() method for using a single Context throughout an application
without passing references around.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →