创建进程以使用multiprocess.Process在多个生成器上并行操作

时间:2018-12-20 01:44:15

标签: python parallel-processing multiprocessing python-multiprocessing

我有一个大型发电机列表,如下所示:

test_list = [(i for i in range(100000000)) for x in range(100)]

这比我的大得多,但是证明了产生发电机的原因。

我想分别评估每个生成器上的函数:

def test_function(generator):
    results = []
    for i in range(3):
        results.append(next(generator))
    return results

对于这样的函数,在应用该函数之前不将整个生成器评估为列表是有意义的。

我想并行运行它:

import multiprocessing as mp

output = mp.Queue()

processes = [mp.Process(target=test_function, args=(generator, )) for generator in test_list]

# Run processes
for p in processes:
    p.start()

# Exit the completed processes
for p in processes:
    p.join()

# Get process results from the output queue
results = [output.get() for p in processes]

但是,我收到一个错误,指出不能腌制发生器。

我可以并行运行此过程的方法是什么?

谢谢, 杰克

1 个答案:

答案 0 :(得分:1)

代替可以被腌制的生成器(如果您想知道为什么,请参阅此answer),使用可以被腌制的迭代器,它们只是具有__next__()方法的对象,因此您可以在它们上呼叫next()。例如:

class first_n_squares:
    def __init__(self, n):
        self.i = 0
        self.n = n

    def __next__(self):
        if self.i < self.n:
            ret = self.i ** 2
            self.i += 1
            return ret
        else:
            raise StopIteration

first_n_squares的实例是一个迭代器,因此可以对其进行腌制,您可以在其上调用next()。例如:

first_5_squares_iter = first_n_squares(5)
first_square = next(first_5_squares_iter)