Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中的进程数_Python_Multithreading_Process_Multiprocessing - Fatal编程技术网

使用多处理控制Python中的进程数

使用多处理控制Python中的进程数,python,multithreading,process,multiprocessing,Python,Multithreading,Process,Multiprocessing,我想控制使用多处理软件包时产生的进程数 假设我只希望同时激活三个进程。我知道的唯一方法是: import multiprocessing import Queue def worker(arg): ## Do stuff return returnvalue argument = list(1,2,3,4,5,6) aliveprocesses = 0 jobs = Queue.Queue() for arg in argument: while jobs.qsize(

我想控制使用多处理软件包时产生的进程数

假设我只希望同时激活三个进程。我知道的唯一方法是:

import multiprocessing
import Queue
def worker(arg):
    ## Do stuff
    return returnvalue

argument = list(1,2,3,4,5,6)
aliveprocesses = 0
jobs = Queue.Queue()
for arg in argument:
    while jobs.qsize() > 2:
        jobs.get().join()
    p = multiprocessing.Process(target=worker,args=(arg,))
    jobs.put(p)
    p.start()
基本上,我只知道如何使用process.join()函数一次监视一个进程。我监视最旧的进程,直到它完成,然后创建一个新进程。对于我的程序来说,最老的进程平均应该比其他进程先完成。但谁知道呢?也许另一个过程会先结束,我无法知道

我能想到的唯一选择是这样的:

import multiprocessing
import time
def worker(arg):
    ## Do stuff
    return returnvalue

argument = list(1,2,3,4,5,6)
aliveprocesses = 0
jobs = set()
for arg in argument:
    while aliveprocesses > 2:
        for j in jobs:
            if not j.is_alive():
                aliveprocesses -= 1
                break
            time.sleep(1)
    p = multiprocessing.Process(target=worker,args=(arg,))
    jobs.put(p)
    p.start()
    aliveprocesses += 1
在上述函数中,您将检查所有进程是否仍处于活动状态。如果它们都还活着,你先睡一会儿,然后再检查,直到出现一个死进程,然后再生成一个新进程。这里的问题是,据我所知,time.sleep()函数不是等待进程结束的特别有效的方法


理想情况下,我想要一个类似Process.join()的函数“superjoin()”,它只使用一组进程对象,当其中一个进程返回时,superjoin()就会返回和superjoin()本身并不使用time.sleep()函数,也就是说,它没有被“推卸责任”

因为您似乎只有一个(并行)任务,而不是单独管理进程,您应该使用更高级别的函数,这样可以更轻松地管理进程的数量

您不能
加入
池,但您有执行此类任务的阻塞调用(例如)

如果您需要更细粒度的控制,您可能需要进行调整