Подтвердить что ты не робот

Состояние смешанной многопроцессорности и потоковой обработки в Python

Каковы наилучшие практики или решения для использования как многопроцессорных, так и пользовательских потоков в одном и том же приложении python в Linux в отношении проблемы 6721, Locks в стандартной библиотеке python следует дезинфицировать в fork?

Зачем мне обоим? Я использую дочерние процессы для выполнения сложных вычислений, которые приводят к слишком большим результатам структуры данных для возврата через очередь - скорее, они должны быть немедленно сохранены на диске. Эффективно было, чтобы каждый из этих дочерних процессов контролировался отдельным потоком, так что, когда он закончен, поток может обрабатывать IO чтения больших (например, нескольких ГБ) данных обратно в процесс, где результат был необходим для дальнейших вычислений в сочетание с результатами других дочерних процессов. Детские процессы периодически зависали, и я просто (после большого удара головой) обнаружил, что "вызвано" с помощью модуля регистрации. Другие документировали проблему здесь:

https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy

который указывает на эту, по-видимому, нерешенную проблему с python: Замки в стандартной библиотеке python должны быть дезинфицированы на fork; http://bugs.python.org/issue6721

Взволнованный тем сложностью, с которой я следил, я ответил:

Есть ли причины не смешивать модуль Multiprocessing и Threading в Python

с довольно бесполезным предложением "Будьте осторожны" и ссылки на вышесказанное.

Но длительная дискуссия re: Issue 6721 предполагает, что это "ошибка" для использования как многопроцессорных (или os.fork), так и пользовательских потоков в одном приложении. Учитывая мое ограниченное понимание проблемы, я нахожу слишком много разногласий в обсуждении, чтобы заключить, что такое обход или стратегии для использования как многопроцессорности, так и потоковой обработки в одном приложении. Моя непосредственная проблема была решена путем отключения ведения журнала, но я создаю небольшую часть других (явных) блокировок как в родительском, так и в дочернем процессах, и подозреваю, что я настраиваю себя на дополнительные прерывистые взаимоблокировки.

Можете ли вы дать практические рекомендации по предотвращению блокировок при использовании блокировок и/или модуля регистрации при использовании потоков и многопроцессорности в приложении python (2,7,3,2,3,3)?

4b9b3361

Ответ 1

Вы будете в безопасности, если вы откажетесь от дополнительных процессов, пока у вас все еще есть только один поток в вашей программе (то есть fork из основного потока, до появления нерестовых рабочих потоков).

Ваш пример использования выглядит так, что вам даже не нужен модуль многопроцессорности; вы можете использовать подпроцесс (или даже более простые вызовы os.system).

См. также Безопасно ли выдровить из потока?