异步和无限循环
Asyncio and infinite loop
@asyncio.coroutine
def listener():
while True:
message = yield from websocket.recieve_message()
if message:
yield from handle(message)
loop = asyncio.get_event_loop()
loop.run_until_complete(listener())
假设我正在使用带有 asyncio 的 websockets。这意味着我收到了来自 websockets
的消息。当我收到一条消息时,我想处理该消息,但我正在用我的代码丢失所有异步的东西。因为 yield from handle(message)
绝对是阻塞的......我怎么能找到一种方法让它成为非阻塞的?比如,同时处理多条消息。不必等待消息处理完毕才能处理另一条消息。
谢谢。
如果您不关心句柄消息中的 return 值,您可以简单地为它创建一个新任务,它将 运行 在事件循环中与您的 websocket reader.这是一个简单的例子:
@asyncio.coroutine
def listener():
while True:
message = yield from websocket.recieve_message()
if message:
asyncio.ensure_future(handle(message))
ensure_future
将创建一个任务并将其附加到默认事件循环。由于循环已经 运行ning,它将与您的 websocket reader 并行处理。事实上,如果它是一个慢速 运行ning I/O 阻塞任务(比如发送电子邮件),您可以轻松地同时处理几十个处理(消息)任务 运行ning。它们在需要时动态创建,并在完成时销毁(开销比产生线程低得多)。
如果你想要更多的控制,你可以简单地写入 reader 中的 asyncio.Queue 并拥有一个可以消耗队列的固定大小的任务池,这是一个典型的模式多线程或多进程编程。
@asyncio.coroutine
def consumer(queue):
while True:
message = yield from queue.get()
yield from handle(message)
@asyncio.coroutine
def listener(queue):
for i in range(5):
asyncio.ensure_future(consumer(queue))
while True:
message = yield from websocket.recieve_message()
if message:
yield from q.put(message)
q = asyncio.Queue()
loop = asyncio.get_event_loop()
loop.run_until_complete(listener(q))
@asyncio.coroutine
def listener():
while True:
message = yield from websocket.recieve_message()
if message:
yield from handle(message)
loop = asyncio.get_event_loop()
loop.run_until_complete(listener())
假设我正在使用带有 asyncio 的 websockets。这意味着我收到了来自 websockets
的消息。当我收到一条消息时,我想处理该消息,但我正在用我的代码丢失所有异步的东西。因为 yield from handle(message)
绝对是阻塞的......我怎么能找到一种方法让它成为非阻塞的?比如,同时处理多条消息。不必等待消息处理完毕才能处理另一条消息。
谢谢。
如果您不关心句柄消息中的 return 值,您可以简单地为它创建一个新任务,它将 运行 在事件循环中与您的 websocket reader.这是一个简单的例子:
@asyncio.coroutine
def listener():
while True:
message = yield from websocket.recieve_message()
if message:
asyncio.ensure_future(handle(message))
ensure_future
将创建一个任务并将其附加到默认事件循环。由于循环已经 运行ning,它将与您的 websocket reader 并行处理。事实上,如果它是一个慢速 运行ning I/O 阻塞任务(比如发送电子邮件),您可以轻松地同时处理几十个处理(消息)任务 运行ning。它们在需要时动态创建,并在完成时销毁(开销比产生线程低得多)。
如果你想要更多的控制,你可以简单地写入 reader 中的 asyncio.Queue 并拥有一个可以消耗队列的固定大小的任务池,这是一个典型的模式多线程或多进程编程。
@asyncio.coroutine
def consumer(queue):
while True:
message = yield from queue.get()
yield from handle(message)
@asyncio.coroutine
def listener(queue):
for i in range(5):
asyncio.ensure_future(consumer(queue))
while True:
message = yield from websocket.recieve_message()
if message:
yield from q.put(message)
q = asyncio.Queue()
loop = asyncio.get_event_loop()
loop.run_until_complete(listener(q))