并行化一个在本地追加到全局声明的列表的函数

时间:2019-12-03 08:36:49

标签: python-3.x multiprocessing joblib

我有一个并行化的函数,我想在其中附加一个列表。我首先在函数外部初始化空列表,然后在函数内部初始化,我在每次迭代时都向其附加值。我正在使用joblib来并行化函数,因此附加顺序不必是顺序的(取决于生产者何时将下一个可用资源提供给joblib,这无关紧要)。下面的代码可以工作,但是会使用当前的i值重新创建一个新的附加列表,它无法记住以前附加的值,从而无法继续附加到先前附加的值:

from joblib import Parallel, delayed

list_a = []


def append_many(i):
    list_a.append(i)
    print(list_a)


num_of_iterations = 10


def producer():
    for i in range(num_of_iterations):
        yield i


out = Parallel(n_jobs=4, verbose=1, pre_dispatch='2*n_jobs', batch_size='auto')(delayed(append_many)(i) for i in producer())
print(list_a)

上面的代码给出以下结果:

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

如果在生成器生成最终迭代值之后打印list_a,则得到[],它正在检索已初始化的空列表的值。

我要实现的目标如下:

num_of_iterations = 10
list_a = []

for i in range(num_of_iterations):
    list_a.append(i)
    print(list_a)

print(list_a)

给出以下结果:

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

我现在还可以通过打印出以下内容来访问循环外的最终附加值:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

如何使用上面的joblib示例获得相同的结果?

0 个答案:

没有答案