Python запускать несколько фоновых циклов независимо - PullRequest
1 голос
/ 05 февраля 2020

В одном из моих проектов мне нужно запускать три разные функции обновления базы данных через разные промежутки времени. Например, функция 1 должна запускаться каждые 30 секунд, функция 2 должна запускаться каждые 60 секунд и функция 3 каждые 5 минут (в частности, из-за ограничений вызовов API).

Я пытался добиться этого в python, просматривая каждое возможное решение, но я не могу найти ничего, что подходит для моего варианта использования. Я довольно свободен sh в python.

Вот (несколько) то, что у меня есть, используя asyncio.

import asyncio

def updater1(url1, url2, time):
    print(f"Doing my thing here every {time} seconds")

def updater2(url1, url2, time):
    print(f"Doing my thing here every {time} seconds")

def updater3(url, time):
    print(f"Doing my thing here every {time} seconds")


async def func1():
    updater1(rankUrl, statsUrl, 30)
    await asyncio.sleep(30)


async def func2():
    updater2(rankUrl, statsUrl, 60)
    await asyncio.sleep(60)


async def func3():
    updater3(url, 300)
    await asyncio.sleep(300)


# Initiate async loops
while True:
    asyncio.run(func1())
    asyncio.run(func2())
    asyncio.run(func3())

Проблема в том, что эти задачи выполняются одна за другой в то время как я пытаюсь добиться того, чтобы они работали независимо друг от друга, со временем запуска, когда сценарий запускается, и в соответствии с их собственным индивидуумом l oop times

Любая идея о том, как это могло бы быть очень важно - я открыт для новых концепций и идей, если у вас есть какие-либо для меня, чтобы исследовать:)

1 Ответ

3 голосов
/ 19 февраля 2020

Не используйте asyncio.run() для отдельных сопрограмм , поскольку async.run() само по себе не асинхронно. Вызов asyncio.run() не будет возвращен, пока не будет выполнена funcN() сопрограмма .

Создайте одну сопрограмму верхнего уровня, которая затем будет запускать другие как задачи:

async def main():
    task1 = asyncio.create_task(func1())
    task2 = asyncio.create_task(func2())
    task3 = asyncio.create_task(func3())

    await asyncio.wait([task1, task2, task3])

Приведенное выше запускает три независимых задачи, а затем ожидает завершения всех 3.

...