gpt4 book ai didi

带有 call_later 的 Python asyncio 递归

转载 作者:行者123 更新时间:2023-11-28 22:21:45 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的监控系统,定期检查并记录它们。这是我尝试使用的逻辑的简化示例,但我不断收到 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)

最佳答案

call_later accepts一个简单的同步回调(一个用 def 定义的函数)。协程函数 (async def) 应该等待执行。


asyncio 的酷炫之处在于它以多种方式模仿命令式纯同步代码。你将如何解决这个简单函数的任务?我想只是睡了一段时间,然后再次递归调用函数。对 asyncio 也做同样的事情(几乎 - 我们应该使用同步 sleep ):

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)

关于带有 call_later 的 Python asyncio 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48070296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com