首页 > 解决方案 > Python - 多处理最大进程数

问题描述

我想一次创建并运行最多 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() 中?我宁愿不需要额外的全局变量。如果我尝试简单地将函数复制/粘贴到里面,我会得到一个讨厌的错误(属性错误不能腌制本地对象'main.(locals).processf')

标签: pythonmultiprocessing

解决方案


为什么不使用concurrent.futures.ThreadPoolExecutor

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


推荐阅读