Количество потоков медленно увеличивается с Asyncio в Python - PullRequest
0 голосов
/ 18 мая 2019

В настоящее время я работаю над скриптом Python, который будет работать долго. Есть функция, которую я хочу запустить несколько раз, поэтому я создал класс со статическим методом-оберткой, которому я передаю функцию и вызываю с помощью asyncio. Когда эта функция завершается или происходит сбой, я обрабатываю ее и перезапускаю:

class ContinuousProcessWrapper:

    @staticmethod
    async def run_continuous_process(function):
        while True:
            try:
                await function()
            except Exception as e:
               logging.error(e)
               logging.warning("Restarting Continuous Process...")

Я называю эту обертку функцией из моего main() метода следующим образом:

loop = asyncio.get_event_loop()
task = loop.create_task(
        ContinuousProcessWrapper.run_continuous_process(logging_workflow))
loop.run_until_complete(task)

Моя функция выглядит примерно так:

async def logging_workflow():
    data_processor = DataProcessor(Settings.environment)

    data_client = Client(Settings.account)
    data_client.connect()

    if len(market_ids) > 0:
        # run task here
    else:
        logging.info(f"Sleeping")
        sleep(3600)

Он работает нормально и перезапускается, как и должно, но с использованием Monit для отслеживания использования памяти и т. Д. Я заметил, что он запускается с 2 потоков, но каждый раз при повторном вызове функции число потоков увеличивается на 1. Я предполагаю, что это указывает на то, что что-то не удаляется, а поток остается бездействующим?

Знаете ли вы, как я могу очистить темы, чтобы они не увеличивались? Или есть предложения о том, как это можно сделать более Pythonic (я большую часть времени являюсь разработчиком на C #) Я бы подумал, что Asyncio сделает это для меня после ожидания, но, возможно, нет.

...