Python-最大进程数的多处理

Python-最大进程数的多处理,python,multiprocessing,Python,Multiprocessing,我希望一次最多创建和运行N个进程。 流程完成后,应立即更换新流程。 以下代码起作用(假设Dostuff是要执行的函数)。 问题是我正在使用一个循环,需要时间.sleep来允许 完成工作的过程。这是相当不够的。 完成这项任务的最佳方法是什么 import time,multiprocessing if __name__ == "__main__": Jobs = [] for i in range(10): while len(Jobs) >= 4:

我希望一次最多创建和运行N个进程。 流程完成后,应立即更换新流程。 以下代码起作用(假设Dostuff是要执行的函数)。 问题是我正在使用一个循环,需要时间.sleep来允许 完成工作的过程。这是相当不够的。 完成这项任务的最佳方法是什么

import time,multiprocessing
if __name__ == "__main__":
    Jobs = []
    for i in range(10):
            while len(Jobs) >= 4:
                    NotDead = []
                    for Job in Jobs:
                            if Job.is_alive():
                                    NotDead.append(Job)
                    Jobs = NotDead
                    time.sleep(0.05)
            NewJob = multiprocessing.Process(target=Dostuff)
            Jobs.append(NewJob)
            NewJob.start()
经过一点修补,我考虑创建新线程,然后 从以下线程启动我的进程:

import threading,multiprocessing,time

def processf(num):
    print("in process:",num)
    now=time.clock()
    while time.clock()-now < 2:
        pass ##..Intensive processing..

def main():
    z = [0]
    lock = threading.Lock()
    def threadf():
        while z[0] < 20:
            lock.acquire()
            work = multiprocessing.Process(target=processf,args=(z[0],))
            z[0] = z[0] +1
            lock.release()
            work.start()
            work.join()

    activet =[]
    for i in range(2):
        newt = threading.Thread(target=threadf)
        activet.append(newt)
        newt.start()
    for i in activet:
        i.join()

if __name__ == "__main__":
    main()
导入线程、多处理、时间
def processf(num):
打印(“正在处理:”,num)
现在=time.clock()
而time.clock()-现在<2:
通过密集加工。。
def main():
z=[0]
lock=threading.lock()
def threadf():
当z[0]<20时:
lock.acquire()
work=multiprocessing.Process(target=processf,args=(z[0],))
z[0]=z[0]+1
lock.release()
开始工作
工作加入
activet=[]
对于范围(2)中的i:
newt=threading.Thread(目标=threadf)
activet.append(newt)
newt.start()
对于activet中的i:
i、 加入
如果名称=“\uuuuu main\uuuuuuuu”:
main()
但是,此解决方案更好(不会减慢已启动的流程), 我不会真的相信我在一个我不知道的领域里写的代码。。 我不得不使用一个列表(z=[0]),因为整数是不可变的。 有没有办法将processf嵌入main()中?我宁愿不需要额外的服务 全局变量。如果我试图简单地复制/粘贴函数,我会得到一个严重的错误(
属性错误无法pickle本地对象“main.(locals).processf')

为什么不使用
concurrent.futures.ThreadPoolExecutor



executor=线程池executor(最大工作线程数=20)
res=执行者提交(任何定义)

你看过吗?