python - 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')
解决方案
为什么不使用concurrent.futures.ThreadPoolExecutor
?
executor = ThreadPoolExecutor(max_workers=20)
res = execuror.submit(any_def)
推荐阅读
- visual-studio - Visual Studio 2015 崩溃 - 如果升级到 VS 2017 计划/预期什么
- python - Python:将参数添加到 os.system
- typescript - 扩展 EventEmitter 并调用 emit
- r - 如何根据 R 中的两个不同列删除或子集样本
- google-apps-script - Google Apps 脚本(看似)在循环中随机挂起(圆圈图标无限期运行)
- ruby-on-rails - 使用 rails 形式的输入计算值并仅将结果存储在 ddbb
- javascript - How do I stop my Discord bot from calling the wrong command?
- javascript - MongoDb 文档未创建 discordjs
- gnuplot - 在 gnuplot 哑终端中更改填充多边形的默认“X”字符?
- r - R - 使用列表计算 DataFrame 的平均值