当您使用 Python 的 multiprocessing
创建进程的 Pool
时,这些进程将 fork 并且父进程中的全局变量将显示在子进程中,如本问题中所述下面:
How can I restrict the scope of a multiprocessing process?
这似乎包括导入的模块。对于在 __init__
中有副作用的模块来说,这是一个问题。 Tensorflow 就是这样一个模块,一旦它被导入,它就会尝试为 GPU 分配内存。这会导致子进程崩溃,因为父进程已经执行了该操作。
有什么好的方法可以避免在fork进程中加载tensorflow模块吗?
Ubuntu (posix) 上的 Python 2.7
最佳答案
经过多次调试后,我意识到我的问题陈述还不够充分。问题是我确实在其中一个子进程中加载了 tensorflow(我忘记了!)并且子进程只需要使用 CPU,而不是 GPU。我被迫更改环境变量以在子进程上禁用 CUDA:
os.environ['CUDA_VISIBLE_DEVICES'] = ''
p = multiprocessing.Pool(processes=4)
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
关于python - 如何避免使用 Python 多处理在 fork 进程中加载父模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43641543/