首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python多处理的池进程限制

Python多处理的池进程限制
EN

Stack Overflow用户
提问于 2013-11-18 11:37:10
回答 4查看 64.9K关注 0票数 52

在使用多处理模块中的Pool对象时,进程的数量是否受到CPU核心数量的限制?例如,如果我有4个核心,即使我创建了一个包含8个进程的池,一次也只有4个进程在运行?

EN

回答 4

Stack Overflow用户

发布于 2013-11-18 12:04:28

您可以请求任意多个进程。任何可能存在的限制都将由操作系统施加,而不是由multiprocessing施加。例如,

代码语言:javascript
复制
 p = multiprocessing.Pool(1000000)

在任何机器上都可能遭受丑陋的死亡。当我输入这段代码时,我正在我的机器上试用它,操作系统正在疯狂地交换RAM,把我的磁盘磨成灰尘--在它创建了大约3000个进程后,最终杀死了它;-)

至于有多少人会“一次”运行,Python在这方面没有发言权。这取决于:

  1. 能够同时运行的硬件数量;以及,
  2. 操作系统决定如何将硬件资源分配给当前正在运行的计算机上的所有进程。

对于受CPU限制的任务,创建比运行它们的核心更多的Pool进程是没有意义的。如果你还在尝试使用你的机器做其他事情,那么你应该创建比核心更少的进程。

对于受I/O限制的任务,创建比核心更多的Pool进程可能更有意义,因为这些进程可能会花费大部分时间被阻塞(等待I/O完成)。

票数 59
EN

Stack Overflow用户

发布于 2013-11-18 12:15:05

是。从理论上讲,您可以创建的进程没有限制,但由于内存耗尽,一次启动的进程数量过多将导致系统死亡。请注意,进程占用的空间比线程大得多,因为它们不使用它们之间的共享空间,而是为每个进程使用单独的空间。

因此,最好的编程实践是使用受系统处理器数量限制的信号量。可能

代码语言:javascript
复制
pool = multiprocessing.Semaphore(4) # no of cpus of your system.

如果你不知道你的系统的核心数量,或者如果你想在很多系统中使用代码,像下面这样的通用代码就可以了。

代码语言:javascript
复制
pool = multiprocessing.Semaphore(multiprocessing.cpu_count()) 
#this will detect the number of cores in your system and creates a semaphore with that  value.  

P.S.,但最好始终使用核数-1。

希望这能有所帮助:)

票数 34
EN

Stack Overflow用户

发布于 2013-11-18 11:59:39

这是正确的。如果你有4个核心,那么4个进程可以同时运行。请记住,您需要执行一些系统任务,并且将进程号定义为number_of_cores - 1对您来说会很好。这是一个首选项,并不是强制性的。您创建的每个进程都有开销,因此您实际上使用了更多的内存来执行此操作。但是如果RAM不是问题,那就去做吧。如果你运行的是Cuda或其他基于GPU的库,那么你会有一个不同的范例,但这是另一个问题。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20039659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档