aiozmq

ZeroMQ integration with asyncio (PEP 3156).

Features

Note

The library works on Linux, MacOS X and Windows.

But Windows is a second-class citizen in ZeroMQ world, sorry.

Thus aiozmq has limited support for Windows also.

Limitations are:

Library Installation

The core requires only pyzmq and can be installed (with pyzmq as dependency) by executing:

pip3 install aiozmq

Also probably you want to use aiozmq.rpc.

RPC module is optional and requires msgpack. You can install msgpack by executing:

pip3 install msgpack

Note

aiozmq can be executed by Python 3 only. The most Linux distributions uses pip3 for installing Python 3 libraries. But your system may be using Python 3 by default than try just pip instead of pip3. The same may be true for virtualenv, travis continuous integration system etc.

Source code

The project is hosted on GitHub

Please feel free to file an issue on bug tracker if you have found a bug or have some suggestion for library improvement.

The library uses Github Actions for Continious Integration.

Dependencies

  • Python 3.6+

  • ZeroMQ 3.2+

  • pyzmq 13.1+ (did not test with earlier versions)

  • aiozmq.rpc requires msgpack

Authors and License

The aiozmq package is initially written by Nikolay Kim, later maintained by Andrew Svetlov, and now by Jelle Zijlstra. It’s BSD licensed and freely available. Feel free to improve this package and send a pull request to GitHub.

Getting Started

Low-level request-reply example:

import asyncio
import aiozmq
import zmq

async def go():
    router = await aiozmq.create_zmq_stream(
        zmq.ROUTER,
        bind='tcp://127.0.0.1:*')

    addr = list(router.transport.bindings())[0]
    dealer = await aiozmq.create_zmq_stream(
        zmq.DEALER,
        connect=addr)

    for i in range(10):
        msg = (b'data', b'ask', str(i).encode('utf-8'))
        dealer.write(msg)
        data = await router.read()
        router.write(data)
        answer = await dealer.read()
        print(answer)
    dealer.close()
    router.close()

asyncio.run(go())

Example of RPC usage:

import asyncio
import aiozmq.rpc

class ServerHandler(aiozmq.rpc.AttrHandler):
    @aiozmq.rpc.method
    def remote_func(self, a:int, b:int) -> int:
        return a + b

async def go():
    server = await aiozmq.rpc.serve_rpc(
        ServerHandler(), bind='tcp://127.0.0.1:5555')
    client = await aiozmq.rpc.connect_rpc(
        connect='tcp://127.0.0.1:5555')

    ret = await client.call.remote_func(1, 2)
    assert 3 == ret

    server.close()
    client.close()

asyncio.run(go())

Note

To execute the last example you need to install msgpack first.

Indices and tables