ZeroMQ python asyncio inproc socket

43 Views Asked by At

I am trying to connect 2 threads together with zeromq inproc.

When I use zmq.Context for 2 threads, latency is about 50-100 microseconds. When switch to zmq.asyncio.Context, latency increses to 300 microseconds.

Is it possible to achieve latency of zmq.Context from zmq.asyncio.Context?

a = []


async def client(context=None):

    context = context or zmq.asyncio.Context().instance()

    receiver = context.socket(zmq.PAIR)
    receiver.connect("inproc://test")

    while True:
        message = await receiver.recv_string()
        print(time.perf_counter_ns() - int(message))
        # a.append(time.perf_counter_ns() - int(message))


async def server(context=None):

    context = context or zmq.asyncio.Context().instance()

    sender = context.socket(zmq.PAIR)
    sender.bind("inproc://test")

    while True:
        await sender.send_string(str(time.perf_counter_ns()))
        await asyncio.sleep(1.0)


def main():

    context = zmq.asyncio.Context().instance()
    context.setsockopt(zmq.IO_THREADS, 2)

    t1 = Thread(
        target=asyncio.run,
        args=(server(context),),
    )
    t2 = Thread(
        target=asyncio.run,
        args=(client(context),),
    )
    t1.start()
    t2.start()

    t1.join()
    t2.join()


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print(numpy.mean(a))
0

There are 0 best solutions below