asyncio 以不同的时间间隔定期运行两个不同的函数

une*_*ven 2 python-3.x python-asyncio

是否可以使用 asyncio 为每个函数以不同的间隔定期运行 2 个不同的函数f

如果是 - 您能否提供代码示例。

import asyncio

async def f1(host,*arg):
    # call every 1 sec
    pass

async def f2(url,*args):
    # call every 2 sec
    pass
Run Code Online (Sandbox Code Playgroud)

预期输出:

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'
Run Code Online (Sandbox Code Playgroud)

use*_*342 5

是否可以使用 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)
Run Code Online (Sandbox Code Playgroud)

问题中描述的场景将设置为:

loop = asyncio.get_event_loop()
loop.create_task(invoke_forever(1, f1, 'host1'))
loop.create_task(invoke_forever(2, f2, 'host2'))
loop.run_forever()
Run Code Online (Sandbox Code Playgroud)

您还可以使用asyncio.gather将两者invoke_forever合并为一个 awaitable,这允许使用asyncio.runPython 3.7 中引入的函数:

async def invoke_both():
    await asyncio.gather(invoke_forever(1, f1, 'host1'),
                         invoke_forever(2, f2, 'host2'))

asyncio.run(invoke_both())
Run Code Online (Sandbox Code Playgroud)

  • 简单而高效 - 先生,您让我度过了一天/周末 - 感谢一百万!!! (2认同)