繁体   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