Asyncio периодически запускают две разные функции с разными интервалами - PullRequest
0 голосов
/ 16 ноября 2018

Можно ли было бы использовать 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

Ожидаемый результат:

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 голосов
/ 16 ноября 2018

Можно ли с помощью 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')))
...