Jef*_*own 26 python concurrency python-asyncio
对于ASYNCIO文档给出了如何打印的"Hello World"每两秒钟两个例子: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio-hello-world-callback https://开头docs.python.org/3/library/asyncio-task.html#asyncio-hello-world-coroutine
我可以从解释器运行那些,但如果我这样做,我将无法访问解释器.是否可以在后台运行asyncio事件循环,以便我可以在解释器中输入命令?
dan*_*ano 42
您可以在后台线程中运行事件循环:
>>> 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
Run Code Online (Sandbox Code Playgroud)
请注意,您必须调用asyncio的asyncio.set_event_loop,否则你会得到一个错误,指出当前线程没有一个事件循环.
如果要与主线程中的事件循环进行交互,则需要坚持loop调用.
虽然这种方法是在解释器中进行实验的好方法,但在实际程序中,您可能希望所有代码都在事件循环中运行,而不是引入线程.
使用Python 3.8,您可以使用新的asyncio REPL。
$ 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())
Run Code Online (Sandbox Code Playgroud)