Поведение стандарт из 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__'
только для того, чтобы включить небольшую функцию глубоко в базе кода. Все еще сохраняя надежду, что есть способ сделать это без изменений на высшем уровне.