ZeroMQ套接字集成到AsyncIO事件循环中
项目描述
鸢尾花是asyncio和ZeroMQ套接字之间的一种实验性替代集成。
我开始尝试使用aiozmq,但我反对其中的一些设计决策。我从该代码中借鉴了一些想法,但做了一些不同的事情
aiozmq是围绕asyncio的协议和传输API构建的,我觉得很难使用;即使是最简单的示例也涉及到继承ZmqProtocol。鸢尾花使用一个单一的AsyncZMQSocket包装类,具有简单的语义。
鸢尾花不包含RPC框架。
鸢尾花期望用户使用PyZMQ创建和连接ZMQ套接字,然后将它们包装在AsyncZMQSocket对象中。
鸢尾花是一种花卉。Asyncio本身最初代号为“郁金香”,并形成了一种传统,即用花卉命名asyncio库。
使用此工具时请自担风险。PyZMQ的作者MinRK告诉我,我绝对不应该依赖ZMQ文件描述符进行事件循环,但我正是这样做的。
ping服务器示例
import asyncio, zmq, zantedeschia
ctx = zmq.Context()
s = ctx.socket(zmq.REP)
s.bind('tcp://127.0.0.1:8123')
async_sock = zantedeschia.AsyncZMQSocket(s)
def pong():
while True:
msg_parts = yield from async_sock.recv_multipart()
yield from async_sock.send_multipart(msg_parts)
asyncio.get_event_loop().run_until_complete(pong())
使用on_recv API代替
import asyncio, zmq, zantedeschia
ctx = zmq.Context()
s = ctx.socket(zmq.REP)
s.bind('tcp://127.0.0.1:8123')
async_sock = zantedeschia.AsyncZMQSocket(s)
@async_sock.on_recv
def pong(msg_parts):
async_sock.send_multipart(msg_parts)
asyncio.get_event_loop().run_forever()