[英]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)
的yield from handle(message)
絕對阻塞......我怎么能找到一種方法使其無阻塞? 比如,在同一時間處理多條消息。 在我可以處理另一條消息之前,不必等待消息處理。
謝謝。
如果你不關心handle消息的返回值,你可以簡單地為它創建一個新的Task,它將在你的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))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.