【问题标题】:Python asyncio event loop. Run loop forever after completing an async taskPython 异步事件循环。完成异步任务后永远运行循环
【发布时间】:2018-04-10 22:17:24
【问题描述】:

嗯,我是 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()

(Full code example)
老实说,我没有收到对loop.run_forever() 的最后一次调用,使用asyncio.start_server 创建的服务器是在执行调用的同一事件循环上运行,还是在内部创建了一个新的事件循环?

如果在内部创建了一个新的事件循环,我不需要调用永远运行,例如只保持进程运行就足够了(当然还有对创建的 Server 的引用)。

我不知道这是否有意义,但如果服务器本身是一个循环(管理传入/传出的连接作为未来的任务)是否可以使用loop.create_task 推送任务?

我没有遇到具体问题,对此感到抱歉。我来自 nodejs 背景,我认为在 python 中实现异步会更容易,感谢您的帮助,任何额外的东西都会受到欢迎!

【问题讨论】:

    标签: python python-3.x python-asyncio asyncsocket


    【解决方案1】:

    你为什么不检查源代码?

    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,你甚至不会运行任何任务。

    【讨论】:

      【解决方案2】:

      老实说,我没有得到对 loop.run_forever() 的最后一次调用,确实如此 使用 asyncio.start_server 创建的服务器在同一个事件循环上运行 执行调用,还是在内部创建一个新的事件循环?

      这是一个单一的全局事件循环。通常最终用户管理创建和运行事件循环,库不在内部进行。

      如果在内部创建了一个新的事件循环,我不需要调用 永远运行,例如保持进程运行可能是 足够了(当然还有对创建的服务器的引用)。

      我不确定我理解你的意思,但这里有一些想法:

      1. 您的服务器只能在事件循环运行时工作。服务器只能通过事件循环接收或发送内容。

      2. loop.run_until_complete(sv_wrapper.create()) 表示该事件 循环用于执行一项作业(创建服务器)然后被停止。 这再次意味着您应该运行它以使创建的服务器正常工作。

      我不知道这是否有意义,但如果服务器是一个循环 本身(管理传入/传出连接作为未来任务)是 可以用 loop.create_task 推送任务吗?

      服务器本身并不是一个事件循环。粗略地说,服务器是由全局事件循环管理的异步任务之一。

      您可以创建其他异步任务(betterensure_future 一起执行),这些任务将由相同的全局事件循环管理(并通过与服务器同时运行的事件循环)。

      【讨论】:

        猜你喜欢
        • 2018-04-10
        • 1970-01-01
        • 2018-09-18
        • 2018-10-17
        • 1970-01-01
        • 2017-09-30
        • 2019-02-14
        • 1970-01-01
        • 2017-07-07
        相关资源
        最近更新 更多