Задания по сельдерею/редису не всегда выполняются - не уверен, почему или как их выполнить

Я запускаю celery v 4.0.3/redis v 4.09 в приложении django v 3.0.1 (Python v 3.6.9). Я также использую face_recognition в задаче celery find_faces для поиска лиц на изображениях, которые я загрузил в приложение, среди других задач celery по обработке изображений. При обработке пяти или менее файлов изображений проблем не возникает, так как все задачи celery по обработке изображений завершаются успешно.

Когда мои задачи обработки изображений (включая find_faces) выполняют итерации над 100 изображениями, есть 10-30 изображений, где задача find_faces не завершается. Когда я использую flower v0.9.7 для просмотра задач celery, я вижу, что статус задачи find_faces "начат" для тех изображений, которые не завершились. Все остальные изображения имеют статус find_faces задачи как "успех". Статус этих "запущенных" задач никогда не меняется, и не сообщается об ошибках или исключениях. Затем я могу запустить задачи обработки изображений, включая задачу find_faces, на каждом из этих изображений по отдельности, и статус задачи будет "успех". Эти результаты не меняются, если я запускаю celery как демон или локально, или если я запускаю приложение django, используя wsgi и apache или runserver. Flower также сообщает, что повторные попытки = 0 для всех моих задач.

У меня CELERYD_TASK_SOFT_TIME_LIMIT = 60 установлен глобально в приложении django, и max_retries=5 для задачи find_faces.

Задача find_faces вызывается как часть более крупной цепочки задач, которые манипулируют изображениями. Каждый файл изображения проходит через эту цепочку, где step_1 и step_2 - это аккорды для различных этапов обработки изображений:

step_1 = chord( group( clean ), chordfinisher.si() ) # clean creates different image sizes
step_2 = chord( group( jobs ), chordfinisher.si() )  # jobs include find_faces
transaction.on_commit(lambda: chain(step_1, step_2, faces_2, ocr_job, change_state_task.si(document_id, 'ready')).delay())

@app.task
def chordfinisher( *args, **kwargs ):
    return "OK"

Изображения большие, поэтому на выполнение задачи find_faces может уйти до 30 секунд. Я думал, что CELERYD_TASK_SOFT_TIME_LIMIT = 60 позаботится об этом длительном времени обработки.

Я ни в коем случае не эксперт по celery, поэтому я предполагаю, что есть параметр или опция celery, которую мне нужно включить, чтобы убедиться, что задание find_faces постоянно завершается. Я просто не знаю, что это может быть.

После дополнительных исследований я могу предложить следующее предложение от Льюиса Кэрролла, в этом посте "Остерегайся убийцы ООМ, сын мой! The jaws that bite, the claws that catch!", и в этом посте Chaining Chords производит чрезвычайно большие сообщения, вызывающие OOM на рабочих, и в этом посте WorkerLostError: Worker exited prematurely: exitcode 155.

Похоже, что у моих рабочих celery, возможно, закончилась память, поскольку я обнаружил следы страшного oomkiller в моих syslogs. Я перенастроил свои задачи так, чтобы они были только в цепочке (удалил все группы и аккорды), так что каждая задача выполняется отдельно в последовательности для каждого изображения, и все задачи успешно завершены, независимо от того, сколько изображений я обрабатывал.

Вернуться на верх