代码之家  ›  专栏  ›  技术社区  ›  Jack Arnestad

创建使用多进程并行操作多个生成器的进程。不首先列出列表的进程

  •  1
  • Jack Arnestad  · 技术社区  · 6 年前

    我有一个大型发电机的清单,如下所示:

    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]
    

    但是,我得到一个错误,生成器不能被pickle。

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

    谢谢, 杰克

    1 回复  |  直到 6 年前
        1
  •  1
  •   Juan López    6 年前

    而不是发电机,它不能被腌制(参见 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 是一个迭代器,所以它可以被腌制,并且你可以调用 下() 关于它。例如:

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