asyncio以不同的间隔定期运行两个不同的功能

时间:2018-11-16 14:37:14

标签: python-3.x python-asyncio

是否可以使用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'

1 个答案:

答案 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')))