我有Python
代码:
from multiprocessing import Process
def f(name):
print 'hello', name
if __name__ == '__main__':
for i in range(0, MAX_PROCESSES):
p = Process(target=f, args=(i,))
p.start()
运行良好。但是,MAX_PROCESSES
是变量,可以是1
和512
之间的任何值。由于我只在具有8
内核的计算机上运行此代码,因此我需要了解是否可以限制允许同时运行的进程数。我研究了multiprocessing.Queue
,但它看起来不像我所需要的-或者也许我对文档的解释不正确。
是否有办法限制同时运行的multiprocessing.Process
的数量?
4条答案
按热度按时间bakd9h0s1#
最明智的做法可能是使用
multiprocessing.Pool
,它根据系统上可用的最大内核数生成一个工作进程池,然后在内核可用时提供任务。标准文档(http://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers)中的示例显示,您也可以手动设置内核数量:
另外,如果代码中需要,还可以使用
multiprocessing.cpu_count()
方法来计算给定系统上的内核数量,这一点也很方便。编辑:下面是一些看起来适合您的特定情况的代码草案:
pw9qyyiw2#
我认为信号量是你要找的,它会阻止主进程后,倒计时到0.示例代码:
下面的代码结构化程度更高,因为它在同一个函数中获取和释放
sema
。但是,如果total_task_num
非常大,它将消耗太多资源:上面的代码将创建
total_task_num
进程,但只有concurrency
进程在运行,而其他进程被阻塞,从而消耗了宝贵的系统资源。qjp7pelc3#
更一般地,这也可以看起来像这样:
当然,这种方法是相当残忍的(因为它等待垃圾中的每个进程,直到它继续下一个块),但它仍然可以在函数调用的运行时间大致相等的情况下工作得很好。
vfh0ocws4#
您可以使用
concurrent.futures
来完成ProcessPoolExecutor
的工作。ProcessPoolExecutor
使用multiprocessing
中的Process
和Semaphore
,这与这里的其他一些答案非常相似。如果你想要here,请查看它。我之所以加上这个答案,是因为到目前为止,它是唯一一个使用更新的API来实现相同功能的示例。