我有一个大型发电机列表,如下所示:
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]
但是,我收到一个错误,指出不能腌制发生器。
我可以并行运行此过程的方法是什么?
谢谢, 杰克
答案 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)