Вкратце
Как я могу обезопасить модуль A исправления из модуля B, когда функции модуля A должны быть импортируемыми, чтобы я мог запускать функции модуля A с multiprocessing
пакетом стандартной библиотеки?
Задний план
Клиент запросил исправление, которое не будет применимо ни к одному из наших клиентов, поэтому я создал новую ветку и написал отдельный модуль только для них, чтобы упростить слияние изменений из основной ветки. Чтобы поддерживать обратную совместимость клиента с поведением префикса, я реализовал исправление как настраиваемый параметр в приложении. Таким образом, я не хотел заменять свой старый код - просто пропатчил его, когда этот параметр был включен. Я сделал это с помощью исправление обезьян.
Структура кода
Модуль __main__
читает файл конфигурации. Если конфигурация включает переключатель исправления, __main__
исправляет мой engine
модуль, заменяя пару функций кодом, определенным в модуле hotfix
- по сути, заменяемая функция - это ключевая функция для функции максимизации. Модуль engine
позже загружает пул работников multiprocessing
.
Проблема
Как только multiprocessing
работник начинает работу, первым делом multiprocessing
он повторно импортирует * модуль engine
и ищет ключевую функцию. который __main__
пытался заменить (затем multiprocessing
передает управление моему коду, и начинается алгоритм максимизации). Поскольку engine
повторно импортируется совершенно новым процессом, и новый процесс не запускается повторно __main__
(где читается файл конфигурации), потому что это может вызвать бесконечный цикл, он не знает, как повторно обезвредить патч engine
.
Вопрос
Как я могу сохранить модульность своего кода (т.е. сохранить код исправления в отдельном модуле) и по-прежнему пользоваться преимуществами пакета Python multiprocessing
?
* Обратите внимание, что мой код должен работать в Windows (для моего клиента) и Unix (для моего рассудка ...)
multiprocessing
не реимпортируется__main__
в дочерние процессы? - person nneonneo   schedule 15.09.2012__main__.main()
вызовет бесконечный цикл. - person wkschwartz   schedule 17.09.2012read_config
иmain()
и вызыватьread_config
, но неmain()
? - person nneonneo   schedule 17.09.2012__main__
выяснить, загружается ли он какmultiprocessing
рабочий или из командной строки? - person wkschwartz   schedule 17.09.2012