Nim*_*Nim 5 python python-3.x python-asyncio
以下是我试图开始工作的代码:
>>> import asyncio
>>> async def foo(loop, iv):
... await asyncio.sleep(1, loop=loop)
... print(f'done: {iv}')
...
>>> loop = asyncio.get_event_loop()
>>> loop.call_later(2, foo, loop, 10)
<TimerHandle when=36395.554089349 foo(<_UnixSelecto...e debug=False>, 10) at <input>:1>
>>> loop.run_forever()
Run Code Online (Sandbox Code Playgroud)
(Python 3.6)
基本上该foo()函数有一些链式async调用,所以这个方法必须async是await链式调用的需要。但是这个方法是延迟触发的,运行这段代码,出现如下问题:
/usr/lib64/python3.6/asyncio/events.py:127: RuntimeWarning: coroutine 'foo' is never awaited self._callback(*self._args)
在 中处理此async调用的正确方法是call_later什么?
Mar*_*ers 10
call_later()仅支持回调(常规函数);您根本无法传入协程。
如果你想延迟一个协程,你有两个选择;要么通过让它在开始时休眠来延迟协程,要么调用asyncio.create_task()from call_later(),它确实接受一个协程并安排它运行。
使用asyncio.sleep()在程序的开始,你可以有循环,直接执行:
async def foo(iv):
# delay start of the work
await asyncio.sleep(2)
# rest of your coroutine
Run Code Online (Sandbox Code Playgroud)
您可以轻松使用包装协程来执行此操作:
async def await_coro_later(delay, coro, *args, **kwargs):
await asyncio.sleep(delay)
await coro(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
如果您使用asyncio.create_task()(或者,对于 Python 3.6 或更早版本,asyncio.ensure_future(),您可以将其传递给call_later():
# create a task for foo(10) later
loop.call_later(2, asyncio.create_task, foo(10))
Run Code Online (Sandbox Code Playgroud)
两种技术的演示:
>>> import asyncio
>>> async def foo(iv, start):
... await asyncio.sleep(1)
... offset = asyncio.get_running_loop().time() - start
... print(f'done ({offset:.3f}s): {iv}')
...
>>> async def await_coro_later(delay, coro, *args, **kwargs):
... await asyncio.sleep(delay)
... await coro(*args, **kwargs)
...
>>> async def demo():
... loop = asyncio.get_running_loop()
... start = loop.time()
... loop.call_later(2, asyncio.create_task, foo('cb_to_create_task', start))
... await await_coro_later(5, foo, 'coro_later', start)
...
>>> asyncio.run(demo())
done (3.004s): cb_to_create_task
done (6.006s): coro_later
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2442 次 |
| 最近记录: |