如何使用Python joblib填充全局变量?

时间:2018-04-27 18:35:12

标签: python multiprocessing global-variables joblib

我想并行运行一些代码并使用 Python 中的结果填充全局变量。我已经编写了一个示例代码来检查 joblib 的行为,但我不知道如何获得结果。示例代码是:

import numpy as np
import multiprocessing
from joblib import Parallel, delayed

global_var = np.zeros(10)

def populate(idx):
   print('I am core',idx,'\')
   global_var[idx] = idx

num_cores = multiprocessing.cpu_count()
Parallel(n_jobs=num_cores)(delayed(populate)(idx) for idx in range(len(global_var))`

如果我在运行其他任何东西之前检查global_var,它是一个零数组;当我运行代码时,数组充满了"无"值。

如何从函数返回值并填充全局数组?

非常感谢您提前! =)

2 个答案:

答案 0 :(得分:1)

基本上,你不能这样做:你需要指定一个带有共享内存的后端,或者手动创建一个共享内存。这涉及更多(但文档涵盖)。

这里,实现它的最简单方法是定义你的函数,使其返回计算结果,然后处理这些结果(通过调用主进程中的Parallel(..)(..)返回(在以Parallel开头的行。

答案 1 :(得分:0)

我知道这是一个旧线程,但其他人可能会知道这是可能的

require='sharedmem'添加到并行初始化。 您可以阅读this link,以获得有关并行化循环的更多示例。


在您的示例中:

import numpy as np
import multiprocessing
from joblib import Parallel, delayed

global_var = np.zeros(10)

def populate(idx):
   print('I am core',idx,'\'')
   global_var[idx] = idx

num_cores = multiprocessing.cpu_count()
Parallel(n_jobs=num_cores, require='sharedmem')(delayed(populate)(idx) for idx in range(len(global_var)))

print(global_var)
  

[0。 1. 2. 3. 4. 5. 5. 6. 7. 8. 9。]