[英]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 創建的服務器是在執行調用的同一個事件循環上運行,還是在內部創建了一個新的事件循環?
它是單個全局事件循環。 通常最終用戶管理創建和運行事件循環,庫不在內部進行。
如果在內部創建了一個新的事件循環,我不需要永遠運行該調用,例如,只要保持進程運行就足夠了(當然還有對創建的服務器的引用)。
我不確定我是否理解你的意思,但這里有一些想法:
您的服務器只能在事件循環運行時工作。 服務器只能通過事件循環接收或發送一些東西。
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.