Запуск программы на Python, которая использует concurrent.futures в веб-приложении на основе сельдерея

Я работаю над приложением django, которое использует сельдерей для распределенных асинхронных процессов. Теперь мне поручили интегрировать процесс, который изначально был написан с concurrent.futures в коде. Итак, мой вопрос: может ли эта работа с одновременной обработкой фьючерсов работать в очереди задач сельдерея. Вызовет ли это какие-нибудь проблемы? Если да, то как лучше всего двигаться вперед? Параллельный процесс, который был написан ранее, требует больших ресурсов, поскольку он может избежать GIL. Кроме того, это очень быстро из-за этого. Мало того, что процесс использует concurrent.futures.ProcessPoolExecutor и внутри него еще несколько (‹5) заданий concurrent.futures.ThreadPoolExecutor.

Итак, теперь реальный вопрос заключается в том, должны ли мы извлечь все основные функции процесса и переписать их, разбив их как задачи приложения сельдерея, или просто сохранить исходный код и запустить его как один большой фрагмент кода в очереди сельдерея.

Согласно проекту системы, пользователь системы может отправить несколько таких задач сельдерея, которые будут содержать параллельный код фьючерса.

Любая помощь будет оценена по достоинству.


person Tragaknight    schedule 12.12.2018    source источник


Ответы (1)


Ваша библиотека должна работать без изменений. Нет никакого вреда в том, что поточный код работает в Celery, если, например, вы не смешиваете gevent с кодом, не совместимым с gevent.

Причины, по которым код нарушается, связаны с управлением ресурсами (уменьшением нагрузки на память / процессор). Что касается потоковой передачи, то вы хотите отслеживать загрузку процессора. Как только ваш параллелизм вызовет достаточную нагрузку (например, потоки, выполняющие интенсивную работу ЦП), ОС начнет переключаться между потоками, и ваша обработка станет медленнее, а не быстрее.

person Nino Walker    schedule 21.12.2018
comment
Спасибо, однако во время интеграции я обнаружил, что, хотя рабочие ThreadPoolExecutor обычно выполняются в контексте сельдерея, рабочие ProcessPoolExecutor в сельдерее выдают ошибку - AssertionError: демоническим процессам не разрешено иметь потомков. Я понимаю, почему это происходит, на основе этого сообщения - stackoverflow .com / questions / 6974695 /, однако я хотел бы знать подводный камень, делающий их недемоническими, и если есть какие-либо, то как сделать задания недемоническими в контексте django celery. - person Tragaknight; 29.01.2019