异步事件循环能否在后台运行而不挂起Python解释器?

2024-05-13 11:29:38 发布

您现在位置:Python中文网/ 问答频道 /正文

asyncio文档提供了两个如何每隔两秒钟打印“Hello World”的示例: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio-hello-world-callbackhttps://docs.python.org/3/library/asyncio-task.html#asyncio-hello-world-coroutine

我可以从解释器中运行它们,但如果这样做,我将无法访问解释器。异步事件循环是否可以在后台运行,以便我可以在解释器中继续键入命令?


Tags: 文档httpsorgasyncio示例docshelloworld
2条回答

对于Python3.8,您可以使用新的AsyncioREPL。

$ python -m asyncio
>>> async def greet_every_two_seconds():
...     while True:
...         print('Hello World')
...         await from asyncio.sleep(2)
...
>>> # run in main thread (Ctrl+C to cancel)
>>> await greet_every_two_seconds()
...
>>> # run in background
>>> asyncio.create_task(greet_every_two_seconds())

编辑:

如果使用Python3.8或更高版本,则应使用asynciorepl,如zeronone's answer中所述。如果使用3.7或更低版本,则可以使用此答案。


可以在后台线程中运行事件循环:

>>> import asyncio
>>> 
>>> @asyncio.coroutine
... def greet_every_two_seconds():
...     while True:
...         print('Hello World')
...         yield from asyncio.sleep(2)
... 
>>> def loop_in_thread(loop):
...     asyncio.set_event_loop(loop)
...     loop.run_until_complete(greet_every_two_seconds())
... 
>>> 
>>> loop = asyncio.get_event_loop()
>>> import threading
>>> t = threading.Thread(target=loop_in_thread, args=(loop,))
>>> t.start()
Hello World
>>> 
>>> Hello World

注意,必须在loop上调用asyncio.set_event_loop,否则将得到一个错误,说明当前线程没有事件循环。

如果要与主线程中的事件循环交互,则需要坚持使用^{}调用。

虽然这是在解释器中进行实验的一种好方法,但在实际程序中,您可能希望代码在事件循环中运行,而不是引入线程。

相关问题 更多 >