Можно ли с помощью asyncio периодически запускать 2 разные функции с разным интервалом для каждого f?
Конечно, просто создайте сопрограмму, которая делает это «очевидным» способоможидая сопрограмму в бесконечном цикле с 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
в одно ожидаемое, что позволяет использовать функцию asyncio.run
, представленную в Python 3.7:
asyncio.run(asyncio.gather(
invoke_forever(1, f1, 'host1'),
invoke_forever(2, f2, 'host2')))