Python:多处理池中的产量
Python: Yield in multiprocessing Pool
我必须并行化涉及某个 "yield" 的函数。这只是我要处理的整个程序的简单复制,但总结了我面临的问题。在这里,我尝试了解我的项目的多处理、apply_async 和收益
在此示例中,我使用了 multiprocessing.pool 并使用了 apply_async 进行并行化。我在 "parallel" 函数中放置了一些打印语句,但它们没有被打印出来。
当我用 return 替换 yield 时,打印语句得到反映。我不确定收益率的性质。我知道它是一个生成器,在 returned 之后只能使用一次。请告知如何让它工作。
import multiprocessing as mp
results=[]
def parallel(x, y, z):
print "aim in parallel"
count=0
result=[]
for line in range(10000):
count+=1
result.append(count)
p=x**3+y+z
print " result"
print result
print p
if p > 0:
return result
# yield result, p
# count += 1
# yield p, result
# count += 1
def collect_results(result):
print "aim in callback"
results.append(result)
#print results
def apply_async_with_callback():
pool = mp.Pool(processes=10)
r = range(10)
[pool.apply_async(parallel, args=(2,5, 7),callback=collect_results) for i in r ]
pool.close()
pool.join()
print "length"
print len(results)
print results
if __name__ == "__main__":
apply_async_with_callback()
当调用包含 yield
语句的函数时,它实际上 运行 不是代码而是 returns 生成器:
>>> p = parallel(1, 2, 3)
>>> p
<generator object parallel at 0x7fde9c1daf00>
然后,当需要下一个值时,代码将 运行 直到产生一个值:
>>> next(p)
([10000], 6)
>>> next(p)
(6, [10000])
在您的例子中,results
包含 10 个异步创建的生成器,但它们实际上从未 运行。
如果您想使用生成器,您可以稍微更改您的代码以针对从生成器创建列表的函数:
def parallel2(x, y, z):
return list(parallel(x, y, z))
def collect_results(lst):
results.extend(lst)
def apply_async_with_callback():
pool = mp.Pool()
for _ in range(10):
pool.apply_async(parallel2, args=(2, 5, 7),
callback=collect_results)
我必须并行化涉及某个 "yield" 的函数。这只是我要处理的整个程序的简单复制,但总结了我面临的问题。在这里,我尝试了解我的项目的多处理、apply_async 和收益 在此示例中,我使用了 multiprocessing.pool 并使用了 apply_async 进行并行化。我在 "parallel" 函数中放置了一些打印语句,但它们没有被打印出来。 当我用 return 替换 yield 时,打印语句得到反映。我不确定收益率的性质。我知道它是一个生成器,在 returned 之后只能使用一次。请告知如何让它工作。
import multiprocessing as mp
results=[]
def parallel(x, y, z):
print "aim in parallel"
count=0
result=[]
for line in range(10000):
count+=1
result.append(count)
p=x**3+y+z
print " result"
print result
print p
if p > 0:
return result
# yield result, p
# count += 1
# yield p, result
# count += 1
def collect_results(result):
print "aim in callback"
results.append(result)
#print results
def apply_async_with_callback():
pool = mp.Pool(processes=10)
r = range(10)
[pool.apply_async(parallel, args=(2,5, 7),callback=collect_results) for i in r ]
pool.close()
pool.join()
print "length"
print len(results)
print results
if __name__ == "__main__":
apply_async_with_callback()
当调用包含 yield
语句的函数时,它实际上 运行 不是代码而是 returns 生成器:
>>> p = parallel(1, 2, 3)
>>> p
<generator object parallel at 0x7fde9c1daf00>
然后,当需要下一个值时,代码将 运行 直到产生一个值:
>>> next(p)
([10000], 6)
>>> next(p)
(6, [10000])
在您的例子中,results
包含 10 个异步创建的生成器,但它们实际上从未 运行。
如果您想使用生成器,您可以稍微更改您的代码以针对从生成器创建列表的函数:
def parallel2(x, y, z):
return list(parallel(x, y, z))
def collect_results(lst):
results.extend(lst)
def apply_async_with_callback():
pool = mp.Pool()
for _ in range(10):
pool.apply_async(parallel2, args=(2, 5, 7),
callback=collect_results)