我正在尝试创建一个简单的监控系统,定期检查并记录它们。这是我尝试使用的逻辑的缩减示例,但我一直收到RuntimeWarning: coroutine 'foo' was never awaited
错误。
我应该如何从自身重新安排异步方法?
test.py中的代码:
import asyncio
from datetime import datetime
async def collect_data():
await asyncio.sleep(1)
return {"some_data": 1,}
async def foo(loop):
results = await collect_data()
# Log the results
print("{}: {}".format(datetime.now(), results))
# schedule to run again in X seconds
loop.call_later(5, foo, loop)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.create_task(foo(loop))
loop.run_forever()
loop.close()
错误:
pi@raspberrypi [0] $ python test.py
2018-01-03 01:59:22.924871: {'some_data': 1}
/usr/lib/python3.5/asyncio/events.py:126: RuntimeWarning: coroutine 'foo' was never awaited
self._callback(*self._args)
答案 0 :(得分:2)
call_later
accepts简单同步回调(使用def
定义的函数)。应该等待执行协程功能(async def
)。
关于asyncio
的一个很酷的事情是,它以多种方式模仿命令式普通同步代码。你如何解决普通功能的这个任务?我想只是睡一段时间并递归再次调用函数。与asyncio
同样(几乎 - 我们应该使用同步睡眠):
import asyncio
from datetime import datetime
async def collect_data():
await asyncio.sleep(1)
return {"some_data": 1,}
async def foo(loop):
results = await collect_data()
# Log the results
print("{}: {}".format(datetime.now(), results))
# Schedule to run again in X seconds
await asyncio.sleep(5)
return (await foo(loop))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(foo(loop))
finally:
loop.run_until_complete(loop.shutdown_asyncgens()) # Python 3.6 only
loop.close()
如果您有时需要在后台运行foo
以及其他协程can create a task。还显示了一种取消任务执行的方法。
<强>更新强>
安德鲁指出,一个简单的循环甚至更好:
async def foo(loop):
while True:
results = await collect_data()
# Log the results
print("{}: {}".format(datetime.now(), results))
# Wait before next iteration:
await asyncio.sleep(5)