Joblib不会填充我的全局数组,也不会写入db / file

时间:2019-12-06 15:22:33

标签: parallel-processing joblib

我想并行执行一个长任务并将数据保存到pickledb中。我为此使用joblib,但是我注意到的是作业做得很好,但是只有最后一个作业被写入我的pickledb文件中。 我尝试了一种最简单的方法来说明这一点,这是一段代码:

from joblib import Parallel, delayed
import multiprocessing
data = []
def main() :
    Parallel(n_jobs=multiprocessing.cpu_count())(delayed(run)(i) for i in range(1, 1000))
    print(data) # this print nothing
def run(i) :
    print(i)
    global data
    data.append(i)
    print(data) # this print something weird

if __name__ == "__main__" :
    main()

这是结果(结果的一部分)

1
[1]
2
[2]
3
[3]
4
[4]
6
[6]
...
150
[145, 146, 147, 148, 149, 150]
151
[145, 146, 147, 148, 149, 150, 151]
152
[145, 146, 147, 148, 149, 150, 151, 152]
153
...
399
[385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399]
400
[385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400]
...
996
[995, 996]
997
[997]
998
[997, 998]
999
[999]
[]

为什么这样做?

我想要达到的目标是:

global
results={}
def run(row, pickledbObject) :
    key, res = ...#doing some stuff with row
    pickledbObject.set(key, res)
    results.update({key, res})

欢迎任何思想 谢谢

更新

我找到了解决方案,我们必须在Parallel类中添加一个附加参数,以允许我们共享内存:

Parallel(n_jobs=multiprocessing.cpu_count(), require='sharedmem')(delayed(run)(i) for i in range(1, 1000))

0 个答案:

没有答案