如何避免使用Pythons多处理在分叉进程中加载​​父模块

时间:2017-04-26 18:08:11

标签: python process tensorflow multiprocessing

当您使用Python Pool创建multiprocessing进程时,这些进程将fork和父进程中的全局变量将显示在子进程中,如下面的问题所示:

How can I restrict the scope of a multiprocessing process?

这似乎包括导入的模块。对于__init__中有副作用的模块而言,这是一个问题。 Tensorflow就是这样一个模块,只要它导入它就会尝试为GPU分配内存。这会导致子进程崩溃,因为父进程已经执行了该操作。

有没有一种好方法可以避免在分叉过程中加载tensorflow模块?

Ubuntu上的Python 2.7(posix)

2 个答案:

答案 0 :(得分:1)

经过大量调试后,我意识到我的问题陈述并不充分。问题是我在其中一个子进程中加载​​了tensorflow(我忘了!)和仅使用CPU而不是GPU所需的子进程。我被迫更改环境变量以禁用子进程上的CUDA:

os.environ['CUDA_VISIBLE_DEVICES'] = ''
p = multiprocessing.Pool(processes=4)
os.environ['CUDA_VISIBLE_DEVICES'] = '0'

答案 1 :(得分:1)

除了David Parks的自我回答之外,在导入TensorFlow或可能被Pool破坏的模块之前创建os.fork()和工作者实例更安全。