将 asyncio ioloop 与 pyzmq 结合使用
Using asyncio ioloop with pyzmq
我想用 zmq 套接字创建一个 tcp 服务器。以下代码使用 python 的 asyncio 的 ioloop.
使用 zmq 套接字创建 tcp 服务器
在下面的代码中,我创建了 zmq 套接字来监听传入的连接。协程 recv_and_process
创建一个套接字来监听连接,并有一个 while 循环来响应传入的连接。
我的问题是如何消除 while
循环并使用现有的 asyncio event loop
?
import asyncio
import zmq
import zmq.asyncio
zmq.asyncio.install()
ctx = zmq.asyncio.Context()
@asyncio.coroutine
def recv_and_process():
sock = ctx.socket(zmq.PULL)
sock.bind('tcp://127.0.0.1:8888')
while True:
msg = yield from sock.recv_multipart() # waits for msg to be ready
print(msg)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(recv_and_process())
我不确定我理解你想要什么,但这里有一些想法:当我们说 "asyncio event loop" 时,我们指的是一些在你的脚本中执行协程的全局对象。您已经通过 运行 使用此事件循环,直到协程 recv_and_process
完成 loop.run_until_complete(recv_and_process())
.
行
运行 asyncio 事件循环来执行协程并不意味着你的程序不应该有简单的 while
循环语句。 While 循环可用于与往常相同的目的 - 重复执行某些操作,例如,包括像您的情况一样等待某些协程。
我想用 zmq 套接字创建一个 tcp 服务器。以下代码使用 python 的 asyncio 的 ioloop.
使用 zmq 套接字创建 tcp 服务器在下面的代码中,我创建了 zmq 套接字来监听传入的连接。协程 recv_and_process
创建一个套接字来监听连接,并有一个 while 循环来响应传入的连接。
我的问题是如何消除 while
循环并使用现有的 asyncio event loop
?
import asyncio
import zmq
import zmq.asyncio
zmq.asyncio.install()
ctx = zmq.asyncio.Context()
@asyncio.coroutine
def recv_and_process():
sock = ctx.socket(zmq.PULL)
sock.bind('tcp://127.0.0.1:8888')
while True:
msg = yield from sock.recv_multipart() # waits for msg to be ready
print(msg)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(recv_and_process())
我不确定我理解你想要什么,但这里有一些想法:当我们说 "asyncio event loop" 时,我们指的是一些在你的脚本中执行协程的全局对象。您已经通过 运行 使用此事件循环,直到协程 recv_and_process
完成 loop.run_until_complete(recv_and_process())
.
运行 asyncio 事件循环来执行协程并不意味着你的程序不应该有简单的 while
循环语句。 While 循环可用于与往常相同的目的 - 重复执行某些操作,例如,包括像您的情况一样等待某些协程。