Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用apply_async创建无限循环?_Python - Fatal编程技术网

Python 如何使用apply_async创建无限循环?

Python 如何使用apply_async创建无限循环?,python,Python,我有一个带有apply_async的进程池,其中不同的进程需要不同的时间来提供输出。一旦一个过程完成,我就用它们的输出做一些计算。之后我想启动另一个进程。通过这种方式,我想创建一个无限循环,它启动进程,读取最近完成的进程的输出,进行一些计算并重新启动另一个进程 到目前为止,除了主进程卡在get()函数中之外,我可以做我想要的事情。这是因为我不知道哪个进程终止了,也不知道应该获取哪个结果条目() 一些尝试代码: import multiprocessing as mp import numpy a

我有一个带有apply_async的进程池,其中不同的进程需要不同的时间来提供输出。一旦一个过程完成,我就用它们的输出做一些计算。之后我想启动另一个进程。通过这种方式,我想创建一个无限循环,它启动进程,读取最近完成的进程的输出,进行一些计算并重新启动另一个进程

到目前为止,除了主进程卡在get()函数中之外,我可以做我想要的事情。这是因为我不知道哪个进程终止了,也不知道应该获取哪个结果条目()

一些尝试代码:

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()