python与os系统多线程,不超过K个并行命令

关于以下示例:


import os

NUM_CPUS = None  # defaults to all available


def worker(f1, f2):

    os.system("run program x on f1 and f2") <--- Big command, cannot run more that K in parallel


def 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并行运行?


天涯尽头无女友
浏览 79回答 1
1回答

万千封印

你的程序对我来说看起来不错。apply_async()是非阻塞调用,但它不会覆盖池边界。如果您的池有五个工作线程,则只有五个任务正在并行运行。其余的任务将在池中排队,并且仅在工作人员空闲时才调度。您的代码将阻塞,pool.join()直到所有工作人员完成为止。如果您需要主程序也被阻止,如果您有五个工作人员正在运行,那么您需要做其他事情,但我无法想象您为什么要这样做。Pool 将在后台处理您的调度,并保持最多 5 个工作线程运行,您无需担心。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python