当函数在导入的库中具有全局状态时,多处理出现问题



这是在机器学习示例中完成的,但我不认为问题或解决方案与使用keras/tensorflow特别相关。

__init__.py

文件与一些我无法绕过的 gobal 状态......

## Silly module with some odd state variables
global __STATE
__STATE = 3
def add(x):
if __STATE == 3:
return x + __STATE
else:
return 0
def finish():
global __STATE
__STATE = None
del __STATE
return 

多处理代码 我想开始工作

def doSomethingComplicated(x):
# x = x + y
# import some libraries
import stateFullStuff 
# create some of its own processes and run them
x = stateFullStuff.add(x)
print (x)
stateFullStuff.finish()
# print ("finished")
return x
from multiprocessing import Pool
if __name__ == '__main__':
x_ = range(100)
pool = Pool(3)
results = pool.map(doSomethingComplicated,x_)
print ("results: ", results)

现在,如果池的工作线程数等于或大于 len(x_(,这就可以正常工作,但这是不可持续的。对于任何人的兴趣,在我的真实代码中导致问题的全局状态是 Keras 中加载的 tensorflow 后端。我相信任务完成后会话已关闭,但某些工人的下一个任务仍然会看到旧会话......

multiprocessing内部通过启动 Python 实例并运行函数来工作。 全局状态根本不共享。 全局代码(外部函数(在新实例中加载每个模块时重新执行。如果您需要multiprocessing中的全局状态,您必须将其保留在主进程中并使用某种形式的通信,例如共享内存映射。有关详细信息,请参阅此处multiprocessing文档。

相关内容

  • 没有找到相关文章

最新更新