我是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中获取异步会更容易,感谢您的帮助,任何额外内容都会很受欢迎!
答案 0 :(得分:1)
老实说,我没有最后一次调用loop.run_forever(),de 使用asyncio.start_server创建的服务器在同一个事件循环上运行 执行调用,还是在内部创建新的事件循环?
它是单一的全局事件循环。通常最终用户管理创建和运行事件循环,图书馆不会在内部进行。
如果在内部创建了新的事件循环,我不需要调用 永远运行,例如只是保持进程运行可能 足够(当然还有对创建的服务器的引用)。
我不确定我明白你的意思,但这里有些想法:
您的服务器只能在事件循环运行时工作。服务器只能通过事件循环接收或发送内容。
loop.run_until_complete(sv_wrapper.create())
表示该事件
循环用于执行一个作业(创建服务器)然后被停止。
同样,这意味着您应该运行它以使创建的服务器工作。
我不知道这是否有意义,但是如果服务器是一个循环 本身(管理进/出连接作为未来的任务)是吗? 可以用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
,你甚至不会执行任何任务。