簡體   English   中英

調用第二個 new_event_loop() 后 ctrl-C 不起作用

[英]ctrl-C doesn't work after calling second new_event_loop()

我無法用 ctrl-C 終止下面的程序:

import asyncio

loop1 = asyncio.new_event_loop()
asyncio.set_event_loop(loop1)

loop2 = asyncio.new_event_loop()

loop1.run_forever()

但是,我可以終止下面的程序:

import asyncio

# execute this first
loop2 = asyncio.new_event_loop()

loop1 = asyncio.new_event_loop()
asyncio.set_event_loop(loop1)

loop1.run_forever()

為什么?

(我在 python 3.11.1,windows 中運行這些)

這兩種方法都不是構建事件循環的正確方法,應該避免這兩種方法,啟動事件循環的官方方法是將asyncio.run()與協程一起使用。

您看到的行為是因為 asyncio 將當前信號處理程序設置為使用signal.set_wakeup_fd中斷最后創建的循環的文件描述符,因此中斷信號被發送到循環 2,而循環 1 正在由進程提供服務並且不是在處理操作系統發送的那些信號時,您可以在Handling Keyboard Interruption中閱讀更多關於 asyncio 處理鍵盤中斷的方式

為了避免所有這些問題,您應該使用官方方式啟動事件循環,即:asyncio文檔中的asyncio.run(main())並避免自己創建循環,否則您會遇到各種麻煩。 (孤立的任務、錯誤的文件描述符、未處理的信號等)或者只是避免創建多個事件循環,並自己處理創建循環的所有相關后果。

應用程序開發人員通常應使用高級異步函數,例如 asyncio.run(),並且很少需要引用循環 object 或調用其方法。 本節主要面向底層代碼、庫和框架的作者,他們需要更好地控制事件循環行為。

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

asyncio.run(main())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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