【发布时间】:2015-05-26 00:30:59
【问题描述】:
生成新进程时,导入的模块变量会发生什么情况?
IE
with concurrent.futures.ProcessPoolExecutor(max_workers=settings.MAX_PROCESSES) as executor:
for stuff in executor.map(foo, paths):
地点:
def foo(str):
x = someOtherModule.fooBar()
foobar 正在访问在 someOtherModule 开头声明的内容:
someOtherModule.py:
myHat='green'
def fooBar():
return myHat
具体来说,我有一个模块(称为 Y),它在顶部初始化了一个 py4j 网关,在任何函数之外。在模块 X 中,我一次加载多个文件,加载后对数据进行排序的函数使用 Y 中的函数,该函数又使用网关。
这个设计是pythonic吗? 我应该在每个新进程生成后导入我的 Y 模块吗?或者有更好的方法吗?
【问题讨论】:
-
Py4J 作者在这里。如果您从不同的进程访问同一个网关,请不要这样做,因为您将与多个进程共享一个套接字 Py4J 并非旨在处理这种情况(尽管它是线程安全的)!相反,为每个进程创建一个新的网关实例。
-
如果我想要我的 java 程序的多个实例怎么办?那能实现吗? (就像在新网关中为每个新的 multiprocessing.process 提供一个新的 java 实例一样)
-
可以,但是每个 Java 进程必须使用不同的端口(可以在创建 GatewayServer 时配置)
标签: python module multiprocessing py4j