- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下是我尝试运行的代码:
>>> 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()
(Python 3.6)
基本上,foo()
函数有一些链式async
调用,因此此方法必须是async
,因为需要await
进行链式调用。然而该方法是在延迟后触发的,当运行该代码时,会出现以下问题:
/usr/lib64/python3.6/asyncio/events.py:127: RuntimeWarning: coroutine 'foo' was never awaited self._callback(*self._args)
在 call_later
中处理此 async
调用的正确方法是什么?
最佳答案
call_later()
仅支持回调(常规函数);你根本无法传入协程。
如果你想延迟一个协程,你有两个选择;要么通过让协程在开始时休眠来延迟协程,要么调用 asyncio.create_task()
来自 call_later()
,它确实采用协程并安排其运行。
在例程开始时使用asyncio.sleep()
,您可以让循环直接执行它:
async def foo(iv):
# delay start of the work
await asyncio.sleep(2)
# rest of your coroutine
您可以轻松地使用包装协程来执行此操作:
async def await_coro_later(delay, coro, *args, **kwargs):
await asyncio.sleep(delay)
await coro(*args, **kwargs)
如果您使用 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))
任一技术的演示:
>>> 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
关于python - 将协程传递给 AbstractEventLoop.call_later,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48235690/
如果我schedule a callback using loop.call_later() (或者使用loop.call_at(),其行为方式相同),是否可以取消其执行?为什么?假设我安排某件事从现
以下是我尝试运行的代码: >>> import asyncio >>> async def foo(loop, iv): ... await asyncio.sleep(1, loop=loo
https://docs.python.org/3/library/asyncio-eventloop.html#delayed-calls Note: Timeouts (relative dela
我正在尝试创建一个简单的监控系统,定期检查并记录它们。这是我尝试使用的逻辑的简化示例,但我不断收到 RuntimeWarning: coroutine 'foo' was never awaited
我有一些使用 call_later 使用 Python 3.4 的 asyncio 制作的简单代码。代码应该打印,等待 10 秒,然后再次打印(但是在应该执行 end() 时引发 TypeError,
我是一名优秀的程序员,十分优秀!