Как мы все знаем, нам нужно защищать main()
при запуске кода с multiprocessing
в Python с использованием if __name__ == '__main__'
.
Я понимаю, что это необходимо в некоторых случаях, чтобы дать доступ к функциям, определенным в основном, но я не понимаю, зачем это нужно в этом случае:
file2.py
import numpy as np
from multiprocessing import Pool
class Something(object):
def get_image(self):
return np.random.rand(64,64)
def mp(self):
image = self.get_image()
p = Pool(2)
res1 = p.apply_async(np.sum, (image,))
res2 = p.apply_async(np.mean, (image,))
print(res1.get())
print(res2.get())
p.close()
p.join()
main.py
from file2 import Something
s = Something()
s.mp()
Все функции или импорты, необходимые для работы Something
, являются частью file2.py
. Почему подпроцессу необходимо повторно запустить main.py
?
Я думаю, что решение __name__
не очень хорошее, так как это мешает мне распространять код file2.py
, так как я не могу убедиться, что они защищают свою основную часть. Нет ли обходного пути для Windows? Как пакеты решают это (поскольку я никогда не сталкивался с проблемой, не защищая мою основную часть каким-либо пакетом - они просто не используют многопроцессорность?)
изменить: я знаю, что это из-за того, что fork()
не реализовано в Windows. Я просто спросил, есть ли хак, позволяющий интерпретатору начинать с file2.py
вместо main.py
, поскольку я могу быть уверен, что file2.py
самодостаточен.
if __name__ == '__main__'
необходим только в Windows, поскольку на этой платформе нетfork()
. Если вы выберете любую другую операционную систему, она вам не понадобится. - person Sven Marnach   schedule 14.07.2017file2.py
как библиотеку и хотите поддерживать пользовательский код, такой какmain.py
(который может быть написан кем-то другим в будущем). К сожалению, я не думаю, что есть какой-либо способ защитить ваших пользователей от требованийmultiprocessing
. Возможно, вам просто нужно задокументировать, что ваш модуль требует, чтобы код скрипта был помещен вif __name__ == "__main__"
блоков, чтобы ничего не запускалось, если модуль импортируется. - person Blckknght   schedule 15.07.2017