是否可以使用asyncio定期为每个功能f
以不同的间隔定期运行2个不同的功能?
如果是,请提供代码示例。
import asyncio
async def f1(host,*arg):
# call every 1 sec
pass
async def f2(url,*args):
# call every 2 sec
pass
预期输出:
00:00 f1 for 1.1.1.1
00:01 f1 for 1.1.1.1
00:02 f2 for 'google.com'
00:02 f1 for 1.1.1.1
00:03 f1 for 1.1.1.1
00:04 f2 for 'google.com'
答案 0 :(得分:1)
是否可以使用asyncio永久性地为每个f定期运行2个不同的函数,并且间隔不同?
当然,只需在调用之间以asyncio.sleep()
的无限循环中等待协程,就可以创建一个以“显而易见”方式执行的协程:
import asyncio, time
async def invoke_forever(period, corofn, *args):
while True:
then = time.time()
await corofn(*args)
elapsed = time.time() - then
await asyncio.sleep(period - elapsed)
问题中描述的场景将采用类似以下内容的设置:
loop = asyncio.get_event_loop()
loop.create_task(invoke_forever(1, f1, 'host1'))
loop.create_task(invoke_forever(2, f2, 'host2'))
loop.run_forever()
您还可以调用asyncio.gather
将两个invoke_forever
组合成一个等待的对象,这允许使用Python 3.7中引入的asyncio.run
函数:
asyncio.run(asyncio.gather(
invoke_forever(1, f1, 'host1'),
invoke_forever(2, f2, 'host2')))