簡體   English   中英

Python 異步事件循環。 完成異步任務后永遠運行循環

[英]Python asyncio event loop. Run loop forever after completing an async task

好吧,我是 python 異步的新手。 我正在使用調用asyncio.start_server創建一個服務器,問題是我運行了兩次相同的循環,第一次創建/啟動調用loop.run_until_complete的服務器,然后是loop.run_forever 這里是我使用的代碼。

if __name__ == '__main__':
    loop = asyncio.get_event_loop()

    sv_wrapper = ServerWrapper(
        host='localhost',
        port=5003
    )

    loop.run_until_complete(sv_wrapper.create())
    print(repr(sv_wrapper.server))

    loop.run_forever()

完整代碼示例
老實說,我沒有得到最后的呼叫loop.run_forever()請問去創建服務器asyncio.start_server運行在相同的事件循環執行的呼叫,或者一個新的事件循環在內部產生的?

如果在內部創建了一個新的事件循環,我不需要永遠運行該調用,例如,只要保持進程運行就足夠了(當然還有對創建的Server的引用)。

我不知道這是否有意義,但是如果服務器本身就是一個循環(管理loop.create_task /傳出連接作為未來的任務)是否可以使用loop.create_task推送任務?

我沒有帶來特定的問題,對此我深表歉意。 我來自 nodejs 背景,我認為在 python 中實現異步會更容易,感謝您的幫助,任何額外的東西都會受到歡迎!

老實說,我沒有得到對 loop.run_forever() 的最后一次調用,使用 asyncio.start_server 創建的服務器是在執行調用的同一個事件循環上運行,還是在內部創建了一個新的事件循環?

它是單個全局事件循環。 通常最終用戶管理創建和運行事件循環,庫不在內部進行。

如果在內部創建了一個新的事件循環,我不需要永遠運行該調用,例如,只要保持進程運行就足夠了(當然還有對創建的服務器的引用)。

我不確定我是否理解你的意思,但這里有一些想法:

  1. 您的服務器只能在事件循環運行時工作。 服務器只能通過事件循環接收或發送一些東西。

  2. loop.run_until_complete(sv_wrapper.create())表示事件循環用於執行一項作業(創建服務器)然后被停止。 這再次意味着您應該運行它以使創建的服務器工作。

我不知道這是否有意義,但是如果服務器本身就是一個循環(管理傳入/傳出連接作為未來的任務)是否可以使用 loop.create_task 推送任務?

服務器本身不是事件循環。 粗略地說,服務器是由全局事件循環管理的異步任務之一。

您可以創建其他異步任務(最好使用ensure_future來完成),這些任務將由相同的全局事件循環管理(並通過與服務器同時運行)。

你為什么不檢查源代碼?

try:
    events._set_running_loop(self)
    while True:                   # Here is the point.
        self._run_once()          # Run event loop once.
        if self._stopping:        # Check stop
            break                 # Stop event loop.
finally:
    self._stopping = False
    self._thread_id = None
    events._set_running_loop(None)
    self._set_coroutine_wrapper(False)
    if self._asyncgens is not None:
        sys.set_asyncgen_hooks(*old_agen_hooks)

這是run_forever一部分。 您可以看到,如果不調用run_forever ,您甚至不會運行任何任務。

暫無
暫無

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

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