关于以下示例:import osNUM_CPUS = None # defaults to all availabledef worker(f1, f2): os.system("run program x on f1 and f2") <--- Big command, cannot run more that K in paralleldef test_run(pool): filelist = os.listdir(files_dir) for f1 in filelist: for f2 in filelist: pool.apply_async(worker, args=(f1, f2))if __name__ == "__main__": import multiprocessing as mp pool = mp.Pool(NUM_CPUS) test_run(pool) pool.close() pool.join()每次os.system调用都会消耗大量资源,因此我无法并行调度超过 K( 5) 的资源。不幸的是,即使NUM_POOLS=5每个设置都会pool.apply_async立即返回。如何指定python不让超过5个worker并行运行?
1 回答
万千封印
TA贡献1891条经验 获得超3个赞
你的程序对我来说看起来不错。
apply_async()
是非阻塞调用,但它不会覆盖池边界。如果您的池有五个工作线程,则只有五个任务正在并行运行。其余的任务将在池中排队,并且仅在工作人员空闲时才调度。
您的代码将阻塞,pool.join()
直到所有工作人员完成为止。如果您需要主程序也被阻止,如果您有五个工作人员正在运行,那么您需要做其他事情,但我无法想象您为什么要这样做。Pool 将在后台处理您的调度,并保持最多 5 个工作线程运行,您无需担心。
添加回答
举报
0/150
提交
取消