【问题标题】:Create process to operate on multiple generators in parallel using multiprocess.Process without making list first使用 multiprocess.Process 创建进程以并行操作多个生成器,而不首先列出列表
【发布时间】:2026-02-10 20:40:01
【问题描述】:

我有一个大型生成器列表,如下所示:

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]

但是,我收到一个错误,即无法腌制生成器。

有什么方法可以并行运行这个过程?

谢谢, 杰克

【问题讨论】:

    标签: python parallel-processing multiprocessing python-multiprocessing


    【解决方案1】:

    不要使用无法腌制的生成器(如果您想知道原因,请参阅此answer),使用可以腌制的迭代器,并且只是具有__next__() 方法的对象,因此您可以调用@987654323 @ 在他们。例如:

    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)
    

    【讨论】:

    • 添加 iter dunder 方法 def __iter__(self): return self 如果你想在循环中使用它作为一个普通的迭代器。
    最近更新 更多