gpt4 book ai didi

python - 异步和无限循环

转载 作者:行者123 更新时间:2023-11-30 23:03:31 25 4
gpt4 key购买 nike

@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 的消息。当我收到一条消息时,我想处理该消息,但我的代码丢失了所有异步内容。因为handle(message)的yield肯定是阻塞的...我怎样才能找到一种方法使其成为非阻塞的?就像同时处理多条消息一样。不必等待消息处理完毕才能处理另一条消息。

谢谢。

最佳答案

如果您不关心句柄消息的返回值,您可以简单地为其创建一个新任务,该任务将与您的 websocket 阅读器一起在事件循环中运行。这是一个简单的例子:

@asyncio.coroutine
def listener():
while True:
message = yield from websocket.recieve_message()
if message:
asyncio.ensure_future(handle(message))

ensure_future 将创建一个任务并将其附加到默认事件循环。由于循环已经在运行,因此它将与您的 websocket 阅读器一起并行处理。事实上,如果它是一个运行缓慢的 I/O 阻塞任务(例如发送电子邮件),您可以轻松地同时运行几十个处理(消息)任务。它们在需要时动态创建,并在完成时销毁(开销比生成线程低得多)。

如果您想要更多的控制,您可以简单地写入读取器中的 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))

关于python - 异步和无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34039588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com