Python 如何使用apply_async创建无限循环?
我有一个带有apply_async的进程池,其中不同的进程需要不同的时间来提供输出。一旦一个过程完成,我就用它们的输出做一些计算。之后我想启动另一个进程。通过这种方式,我想创建一个无限循环,它启动进程,读取最近完成的进程的输出,进行一些计算并重新启动另一个进程 到目前为止,除了主进程卡在get()函数中之外,我可以做我想要的事情。这是因为我不知道哪个进程终止了,也不知道应该获取哪个结果条目() 一些尝试代码:Python 如何使用apply_async创建无限循环?,python,Python,我有一个带有apply_async的进程池,其中不同的进程需要不同的时间来提供输出。一旦一个过程完成,我就用它们的输出做一些计算。之后我想启动另一个进程。通过这种方式,我想创建一个无限循环,它启动进程,读取最近完成的进程的输出,进行一些计算并重新启动另一个进程 到目前为止,除了主进程卡在get()函数中之外,我可以做我想要的事情。这是因为我不知道哪个进程终止了,也不知道应该获取哪个结果条目() 一些尝试代码: import multiprocessing as mp import numpy a
import multiprocessing as mp
import numpy as np
from time import sleep
def squared(x,y):
result = np.array((x,x))
if x%2 == 0:
sleep(2)
return result
if __name__ == "__main__":
pool = mp.Pool()
pool_r = []
for i in xrange(0,8):
pool_r.append(pool.apply_async(squared, (i,i)))
count_results = 0
for j in xrange(0,10):
result = pool_r[count_results].get()
print result
count_results += 1
pool_r.append(pool.apply_async(squared, (j,j)))
pool.close()
pool.join()
输出为:
[0 0]
[1 1]
[2 2]
[3 3]
[4 4]
[5 5]
[6 6]
[7 7]
[0 0]
[1]
而不是先是奇数,然后是偶数(因为这些数字有睡眠)
有什么建议吗
非常感谢您的快速回复 实际上,我希望在流程完成后保持一个无限循环(我需要它们的结果才能进入循环) Q1-如果我创建一个包含30个作品的池,我可以提交30个以上的流程吗?计算机会等一个完成后再让另一个工作吗 在代码中有一个回调函数。但是,当一个工作进程完成时,我需要运行的代码必须在主进程中,因为我必须更新将发送到我创建的新进程的变量 Q3-主流程所需的代码,比如说流程实现其任务所需时间的10%。那么,让主流程实现一些计算,然后启动新流程是一种好方法吗 Q4-现在,如果我按Ctrl+C组合键,代码只会在所有进程结束时终止。在执行Ctrl+C时,我可以做些什么来终止代码?最后,在我的评论之后,你认为未来仍然是一条路吗 我需要的一些伪代码:
launch several processes
wait for the results
launch several processes
while True:
get results from a recently finished process
do some calculations
launch two more processes
# some ending condition
问题是,您正在按照作业的发布顺序等待结果,而不是按照作业完成的顺序。所以,如果作业1在作业0之前完成,这并不重要;您仍在等待作业0 从根本上说,问题在于
apply\u async
返回AsyncResult
对象,这些对象不是可组合的未来对象,但您希望像使用它们一样使用它们。你不能那样做。无法并行地等待一堆AsyncResult
s,直到其中一个完成。如果需要,可以使用python2.7,或者PyPI上的backport;然后,您可以对任何期货序列调用wait
,或者在您完成时迭代
您可以在AsyncResult
的基础上,通过使用回调而不是wait
来模拟这种情况,但这会让您的生活变得更加艰难,因为您必须将控制流从内到外转换。比如:
pool = mp.Pool()
count_results = 0
def handle_result(result):
global count_results, done
print result
if count_results < 10:
pool.apply_async(squared, (count_results, count_results),
callback=handle_result)
elif count_results == 18:
pool.close()
count_results += 1
for i in xrange(0,8):
pool.apply_async(squared, (i,i), callback=handle_result)
pool.join()
pool=mp.pool()
计数结果=0
def句柄_结果(结果):
全局计数结果,完成
打印结果
如果计数结果小于10:
pool.apply_async(平方,(计数结果,计数结果),
回调=句柄(结果)
elif计数结果==18:
pool.close()
计数结果+=1
对于x范围内的i(0,8):
apply\u async(平方,(i,i),回调=句柄\u结果)
pool.join()