Python - 多处理最大进程数

时间:2018-05-22 14:09:31

标签: python multiprocessing

我想一次创建并运行最多N个进程。 一旦流程完成,新流程就应该取而代之。 以下代码有效(假设Dostuff是要执行的函数)。 问题是我正在使用循环并需要time.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()

此解决方案更好(不会减慢已启动的流程),但是, 我不会非常信任我写的代码,而 因为整数是不可变的,所以我必须使用一个列表(z = [0])。 有没有办法将processf嵌入main()?我不想再需要额外的东西 全局变量。如果我尝试简单地复制/粘贴函数,我会得到一个令人讨厌的错误( 属性错误不能腌制本地对象&#39; main。(本地人).processf&#39;)

1 个答案:

答案 0 :(得分:0)

为什么不使用concurrent.futures.ThreadPoolExecutor

executor = ThreadPoolExecutor(max_workers=20) res = execuror.submit(any_def)