【问题标题】:Python multiprocessing's Pool process limitPython多处理池进程限制
【发布时间】:2013-12-01 02:57:49
【问题描述】:

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

【问题讨论】:

  • 您可以创建的数量没有限制;但是从一定数量开始,使用多个流程的有效性将变成一种惩罚。这个数字有多大很大程度上取决于线程会做什么。如果只有处理器在工作,那么你不应该启动比你的处理器支持线程更多的进程(例如 i7 4 核处理器有 8 个线程)。
  • linux(用户/系统)进程的限制在/etc/security/limits.conf中定义。

标签: python multiprocessing cpu-cores


【解决方案1】:

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

 p = multiprocessing.Pool(1000000)

在任何机器上都可能遭受丑陋的死亡。当我输入这个时,我正在我的盒子上尝试它,并且操作系统正在将我的磁盘磨成灰尘,疯狂地换出 RAM - 最后在它创建了大约 3000 个进程后将其杀死;-)

至于“一次”运行多少个,Python 没有发言权。这取决于:

  1. 您的硬件能够同时运行多少;并且,
  2. 您的操作系统如何决定将硬件资源提供给您计算机上当前运行的所有进程。

对于 CPU 密集型任务,意义创建更多的Pool 进程而不是运行它们的核心。如果您也尝试将您的机器用于其他事情,那么您应该创建比内核更少的进程。

对于 I/O 密集型任务,可能创建比核心更多的 Pool 进程,因为这些进程可能大部分时间都处于阻塞状态(等待 I /O 完成)。

【讨论】:

  • 请记住,进程来自os.fork,因此将涉及父进程内存占用的副本。这在某些操作系统中可能是写时复制,但一般来说,如果想要利用大量“单元”,每个“单元”都执行可以异步处理以避免阻塞的任务,线程通常是更好的“单元” ' 的异步性高于进程(但并非总是如此)。即使使用 GIL,执行 GIL 释放操作的线程也可以从中受益。
  • 使用更多进程会导致内存泄漏? multiprocessing.cpu_count() 在我的系统上返回 16,我使用的是 8 (cpu_count //2)。
  • 您的操作系统为您创建的每个进程都需要 RAM。这不是“泄漏”:当您创建一个进程时,您是在强制操作系统吃掉该 RAM。 8 个过程在任何现代机器上都应该是微不足道的。
【解决方案2】:

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

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

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

如果您不知道系统的核心数量,或者如果您想在多个系统中使用该代码,则可以使用如下通用代码...

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. 但是最好总是使用 cores-1 的数量。

希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    虽然您没有可以设置的限制,但如果您想了解一个方便的数字以用于 CPU 绑定进程(我怀疑您在这里寻找),您可以运行以下命令:

    >>> import multiprocessing
    >>> multiprocessing.cpu_count()
    1
    

    答案here 中提到了一些关于限制的好注释(尤其是在 linux 中):

    【讨论】:

      【解决方案4】:

      没错。如果您有 4 个内核,则可以同时运行 4 个进程。请记住,您有需要继续进行的系统工作,最好将进程号定义为number_of_cores - 1。这是一种偏好,不是强制性的。对于您创建的每个进程都有开销,因此您实际上使用了更多内存来执行此操作。但如果RAM不是问题,那就去吧。如果您正在运行 Cuda 或其他基于 GPU 的库,那么您有不同的范例,但这是另一个问题。

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 2022-01-08
        • 1970-01-01
        • 2022-11-30
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 2021-07-24
        • 2020-08-14
        相关资源
        最近更新 更多