簡體   English   中英

Asyncio和無限循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM