在 Linux 上,fork
将用于生成子级,因此父级全局范围内的任何内容也将在子级中可用,具有写时复制语义。
在 Windows 上,您import
在父进程模块中的模块级别的任何内容都__main__
将重新导入子进程。
这意味着如果您有一个父模块(我们称之为someModule
),如下所示:
import someOtherModule
import concurrent.futures
def foo(str):
x = someOtherModule.fooBar()
if __name__ == "__main__":
with concurrent.futures.ProcessPoolExecutor(max_workers=settings.MAX_PROCESSES) as executor:
for stuff in executor.map(foo, paths):
# stuff
someOtherModule
看起来像这样:
myHat='green'
def fooBar():
return myHat
在这个例子中,someModule
是__main__
脚本的模块。因此,在 Linux 上,myHat
您在子节点中获得的实例将是someModule
. 在 Windows 上,每个子进程将someModule
在加载后立即重新导入,这也会导致someOtherModule
重新导入。
我对 py4jGateway
对象知之甚少,无法确定您是否确定这是您想要的行为。如果Gateway
对象是可腌制的,您可以将其显式传递给每个孩子,但您必须使用 amultiprocessing.Pool
而不是concurrent.futures.ProcessPoolExecutor
:
import someOtherModule
import multiprocessing
def foo(str):
x = someOtherModule.fooBar()
def init(hat):
someOtherModule.myHat = hat
if __name__ == "__main__":
hat = someOtherModule.myHat
pool = multiprocessing.Pool(settings.MAX_PROCESSES,
initializer=init, initargs=(hat,))
for stuff in pool.map(foo, paths):
# stuff
不过,您似乎不需要为您的用例执行此操作。使用重新导入可能没问题。