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

ang*_*ado 3 python global-variables multiprocessing 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))`
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢您提前!=)

Bas*_*ast 5

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

添加require='sharedmem'到并行初始化。您可以阅读此链接以获取有关并行化循环的更多示例。


所以在你的例子中:

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 仅供参考,这使用了线程后端,这在 Python 中的大多数情况下违背了并行性的目的 (2认同)

Guy*_*ush 2

基本上,您不能这样做:您需要指定具有共享内存的后端,或者手动创建共享内存。这有点复杂(但已在文档中介绍)。

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