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