В настоящее время я работаю над скриптом 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 сделает это для меня после ожидания, но, возможно, нет.