Возможно ли создать многопроцессорные дочерние / рабочие процессы Python, которые не импортируют модуль __main__? - PullRequest
1 голос
/ 08 июня 2019

Поведение стандарт из multiprocessing в Windows заключается в импорте модуля __main__ в дочерние процессы при порождении.

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

Есть ли способ явно указать импорт для дочерних процессов? Если нет многопроцессорной библиотеки, есть ли альтернатива?

Хотя меня особенно интересует Python 3, ответы на Python 2 могут быть полезны для других.


Редактировать

Я подтвердил, что подход , предложенный Ли Райаном , работает, как показано в следующем примере:

import sys
import types

def imports():
    for name, val in globals().items():
        if isinstance(val, types.ModuleType):
            yield val.__name__

def worker():
    print('Worker modules:')
    print('\n'.join(imports()))

if __name__ == '__main__':
    import multiprocessing

    print('Main modules:')
    print('\n'.join(imports()))
    print()

    p = multiprocessing.Process(target=worker)
    p.start()
    p.join()

Вывод:

Main modules:
builtins
sys
types
multiprocessing

Worker modules:
sys
types

Тем не менее, я не думаю, что смогу продать остальную часть моей команды за оболочку сценария верхнего уровня в if __name__ == '__main__' только для того, чтобы включить небольшую функцию глубоко в базе кода. Все еще сохраняя надежду, что есть способ сделать это без изменений на высшем уровне.

1 Ответ

1 голос
/ 08 июня 2019

Документы, на которые вы ссылаетесь, говорят вам:

Убедитесь, что основной модуль может быть безопасно импортирован новым интерпретатором Python, не вызывая непреднамеренных побочных эффектов (таких как запуск нового процесса).

...

Вместо этого следует защитить «точку входа» программы, используя if __name__ == '__main__': следующим образом:

...

Вы также можете поместить операторы импорта внутри блока if, тогда эти операторы импорта будут выполняться только при запуске __main__.py в качестве программы, но не при импорте __main__.py.


<flame> Либо так, либо используйте реальную ОС, которая поддерживает настоящий fork () - ing </flame>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...