我想一次创建并运行最多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;)
答案 0 :(得分:0)
为什么不使用concurrent.futures.ThreadPoolExecutor
?
executor = ThreadPoolExecutor(max_workers=20)
res = execuror.submit(any_def)