Skip to main content

Python binding for omq.rs (Rust libzmq port). Drop-in pyzmq replacement on the common path.

Project description

pyomq

Python binding for omq.rs, a Rust libzmq port. Drop-in pyzmq replacement on the common path.

Install

uv pip install pyomq
# Optional extras (built into the wheel via cargo features):
uv pip install 'pyomq[curve]'
uv pip install 'pyomq[blake3zmq,lz4,zstd]'
uv pip install 'pyomq[test]'   # adds pytest, pyzmq for the interop suite

Usage

import pyomq as zmq  # drop-in for `import zmq` from pyzmq

ctx = zmq.Context()
push = ctx.socket(zmq.PUSH)
push.connect("tcp://127.0.0.1:5555")
push.send(b"hello")
push.close()
ctx.term()

For asynchronous code:

import pyomq.asyncio as zmq_async

ctx = zmq_async.Context()
sock = ctx.socket(pyomq.PUSH)
await sock.connect("tcp://127.0.0.1:5555")
await sock.send(b"hello")
await sock.close()

Status

Sync and asyncio APIs both ship in this release. All 19 ZMTP socket types are wired:

  • Standard (RFC 28 + 47): PAIR, PUB, SUB, REQ, REP, DEALER, ROUTER, PULL, PUSH, XPUB, XSUB.
  • Draft: SERVER, CLIENT (RFC 41), RADIO, DISH (RFC 48), GATHER, SCATTER (RFC 49), PEER, CHANNEL (RFC 51).

Transports: tcp://, ipc://, inproc://, and udp:// (RADIO/DISH only). Optional features built into the wheel: curve, blake3zmq, lz4, zstd.

DISH groups: use socket.join(b"group") / socket.leave(b"group") to manage subscriptions; messages are sent as multipart [group, body].

Backend

pyomq is built on omq-compio (single-threaded io_uring on Linux). The runtime runs on a dedicated background thread; every Python call releases the GIL across the runtime trip. This is the only backend pyomq supports — the omq-tokio backend exists in the upstream Rust workspace for callers that need a multi-thread tokio integration, but pyomq's per-call overhead is shaped around compio's single-thread invariant.

Performance

Loopback PUSH/PULL throughput vs pyzmq, on a Linux 6.12 (Debian 13) VM on an Intel Mac Mini 2018 (i7-8700B, 3.2 GHz), Rust 1.95.0, default features:

Size inproc pyomq inproc pyzmq ratio tcp pyomq tcp pyzmq ratio
8 B 1.30 M/s 627 k/s 2.08× 1.36 M/s 565 k/s 2.41×
32 B 1.29 M/s 620 k/s 2.08× 1.36 M/s 576 k/s 2.37×
128 B 1.31 M/s 516 k/s 2.54× 1.29 M/s 496 k/s 2.61×
512 B 1.29 M/s 480 k/s 2.69× 1.21 M/s 461 k/s 2.62×
2 KiB 1.17 M/s 461 k/s 2.54× 908 k/s 342 k/s 2.65×
8 KiB 1.04 M/s 368 k/s 2.83× 349 k/s 102 k/s 3.41×
32 KiB 622 k/s 196 k/s 3.17× 116 k/s 46 k/s 2.50×
128 KiB 203 k/s 70 k/s 2.91× 32 k/s 24 k/s 1.32×

zmq.proxy() forwarding (128 B, TCP)

pyomq pyzmq ratio
PUSH/PULL msg/s 963 k/s 520 k/s 1.85×
REQ/REP rt/s 8,764/s 6,521/s 1.34×

pyomq's proxy() runs as a native Rust async loop on the compio thread — no Python per-message overhead. pyzmq's zmq.proxy() calls libzmq's C-level zmq_proxy. PUSH/PULL forwarding is throughput-bound and pyomq is ~1.9× faster. REQ/REP is latency-bound (4 TCP hops per round-trip) so both are similar.

Run scripts/update_perf.py (after maturin develop --release) to re-measure and update the tables above.

Develop

cd bindings/pyomq
uv venv && source .venv/bin/activate
uv pip install maturin pytest pyzmq
maturin develop --release
pytest -v

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyomq-0.2.3.tar.gz (291.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyomq-0.2.3-cp39-abi3-manylinux_2_34_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.9+manylinux: glibc 2.34+ x86-64

File details

Details for the file pyomq-0.2.3.tar.gz.

File metadata

  • Download URL: pyomq-0.2.3.tar.gz
  • Upload date:
  • Size: 291.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.1

File hashes

Hashes for pyomq-0.2.3.tar.gz
Algorithm Hash digest
SHA256 39db1a35bbcce18d323493ff9d8ff6e59662b21694ab03fff3490d46adf0e496
MD5 e1caef1e28d05d2f0f480c8a8ff9fabf
BLAKE2b-256 c5c5846f76800889633542908be9bad7df73c17f67f1a54a0978dbeb9a756e01

See more details on using hashes here.

File details

Details for the file pyomq-0.2.3-cp39-abi3-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for pyomq-0.2.3-cp39-abi3-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 0ad8a30d1016b77d3b2282221a041c5486bd88a333d68d51af3f0754f8de7118
MD5 4b295ce8cc992d099554c1dbc6b4a5ad
BLAKE2b-256 a644fc617d4183de8afbae8f0fa876db3d736e0aa458913255bf5f5d4c52451d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page