Длительно выполняемые задачи asyncio зависают примерно через 1 час. Как я могу отладить?Python

Программы на Python
Ответить
Anonymous
 Длительно выполняемые задачи asyncio зависают примерно через 1 час. Как я могу отладить?

Сообщение Anonymous »

У меня есть давно работающее приложение Python, построенное на asyncio. Он запускает несколько фоновых задач, которые выполняются неопределенное время, и иногда выполняет работу ЦП с использованием asyncio.to_thread. Некоторое время все работает нормально, но примерно через час все асинхронные задачи, кажется, перестают выполняться, никаких исключений, никакой загрузки процессора или памяти, просто полное зависание.
Это случалось со мной в нескольких проектах, которые в значительной степени полагаются на параллелизм asyncio, но до сих пор мне никогда не удавалось воспроизвести это на небольшом примере.
Вот минимальный пример, который в конечном итоге демонстрирует зависание:

Код: Выделить всё

import asyncio
from concurrent.futures import ThreadPoolExecutor

executor = ThreadPoolExecutor(max_workers=10)

async def dummy_task(i):
await asyncio.sleep(0.1)
return i

async def batch_eval(trades):
results = await asyncio.gather(*(dummy_task(t) for t in trades))
return results

def sync_batch_eval(trades):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
results = loop.run_until_complete(batch_eval(trades))
loop.close()
return results

async def main():
i = 0
while True:
trades = list(range(10))
res = await asyncio.get_running_loop().run_in_executor(
executor, sync_batch_eval, trades
)
if i % 50 == 0:
print("iteration", i, "ok")
i += 1
await asyncio.sleep(0.05)

asyncio.run(main())
После некоторого запуска (10–60 минут, в зависимости от системы) выходные данные перестают печатать и никаких ошибок не появляется.

Загрузка процессора падает почти до нуля, но процесс остается активным.
Мой реальный код (см. этот репозиторий, точку входа здесь) следует аналогичному шаблону, где я вызываю функцию, например:

Код: Выделить всё

def sync_batch_eval(trades, settings, allow_edge):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
async def run_batch():
tasks = [batch_evaluate_trade(trade, settings, allow_edge) for trade in trades]
return await asyncio.gather(*tasks)
results = loop.run_until_complete(run_batch())
loop.close()
return results
Почему все задачи в конечном итоге зависают, хотя исключений не возникает и системные ресурсы выглядят нормально?


Подробнее здесь: https://stackoverflow.com/questions/798 ... an-i-debug
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»