Mic*_*ael 7 python python-3.4 python-asyncio
我有以下情况:
callback使用call_soon执行我的函数.callback我想打电话给另一个courotune,但结果是"冻结"回调.我将使用call_soon()修改Hello World来演示:
import asyncio
def hello_world(loop):
print('Hello')
# Call some coroutine.
yield from asyncio.sleep(5, loop=loop)
print('World')
loop.stop()
loop = asyncio.get_event_loop()
# Schedule a call to hello_world()
loop.call_soon(hello_world, loop)
# Blocking call interrupted by loop.stop()
loop.run_forever()
loop.close()
Run Code Online (Sandbox Code Playgroud)
当我运行它时,没有任何东西正在打印,程序永远不会结束.
按Ctrl + C
Traceback (most recent call last):
File "../soon.py", line 15, in <module>
loop.run_forever()
File "/usr/lib/python3.4/asyncio/base_events.py", line 276, in run_forever
self._run_once()
File "/usr/lib/python3.4/asyncio/base_events.py", line 1136, in _run_once
event_list = self._selector.select(timeout)
File "/usr/lib/python3.4/selectors.py", line 432, in select
fd_event_list = self._epoll.poll(timeout, max_ev)
KeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)
究竟发生了什么,为什么?
有没有正确的方法呢?
您提到的示例演示了如何安排回调.
如果你使用yield from语法,该函数实际上是一个协程,它必须相应地进行装饰:
@asyncio.coroutine
def hello_world(loop):
print('Hello')
yield from asyncio.sleep(5, loop=loop)
print('World')
loop.stop()
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用ensure_future将协程安排为任务:
loop = asyncio.get_event_loop()
coro = hello_world(loop)
asyncio.ensure_future(coro)
loop.run_forever()
loop.close()
Run Code Online (Sandbox Code Playgroud)
或者等效地,使用run_until_complete:
loop = asyncio.get_event_loop()
coro = hello_world(loop)
loop.run_until_complete(coro)
Run Code Online (Sandbox Code Playgroud)
在两周内,python 3.5将正式发布,您将能够使用新的async/await语法:
async def hello_world(loop):
print('Hello')
await asyncio.sleep(5, loop=loop)
print('World')
Run Code Online (Sandbox Code Playgroud)
编辑:这有点难看,但没有什么能阻止你创建一个调度你的协同程序的回调:
loop = asyncio.get_event_loop()
coro = hello_world(loop)
callback = lambda: asyncio.ensure_future(coro)
loop.call_soon(callback)
loop.run_forever()
loop.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5729 次 |
| 最近记录: |