Python asyncio事件循环。完成异步任务后永远运行循环

时间:2017-10-30 00:38:18

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

我是python中异步的新手。我正在使用调用asyncio.start_server创建一个服务器,问题是我运行了两次相同的循环,第一次创建/启动服务器调用loop.run_until_complete,之后loop.run_forever 1}}。这是我使用的代码。

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运行的服务器,或者是否在内部创建了新的事件循环?

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

它是单一的全局事件循环。通常最终用户管理创建和运行事件循环,图书馆不会在内部进行。

  

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

我不确定我明白你的意思,但这里有些想法:

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

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

  3.   

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

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

    您可以创建其他异步任务(better来执行ensure_future),这些任务将由同一个全局事件循环管理(并通过与服务器并发运行)。

答案 1 :(得分:0)

为什么不检查源代码?

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