[英]Python multiprocessing's Pool process limit
在使用来自多处理模块的Pool对象时,进程数是否受CPU内核数的限制? 例如,如果我有4个核心,即使我创建具有8个进程的Pool,一次只能运行4个?
您可以根据需要请求多个进程。 可能存在的任何限制将由您的操作系统强加,而不是由multiprocessing
强加。 例如,
p = multiprocessing.Pool(1000000)
在任何机器上都可能遭受丑陋的死亡。 我在输入时在盒子上尝试,操作系统正在磨碎我的磁盘,以疯狂地交换掉RAM-在它创建了大约3000个进程之后最终将其杀死;-)
至于“一次”将运行多少,Python对此没有发言权。 这取决于:
对于与CPU绑定的任务,创建比您具有运行它们的核心更多的Pool
进程没有任何意义 。 如果您也尝试将计算机用于其他用途,则创建的进程应少于核心。
对于受I / O约束的任务,创建比内核更多的Pool
进程可能是有意义的,因为这些进程可能会花费大部分时间来阻塞(等待I / O完成)。
是。 从理论上讲,您可以创建的进程没有限制,但是由于内存不足,一次启动的大量进程会导致系统死亡。 请注意,进程占用的内存比线程大得多,因为它们不使用它们之间的共享空间,而是为每个进程使用单独的空间。
因此,最佳的编程习惯是使用仅限于系统处理器数量的信号量。 可能的
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.
PS,但始终使用核心数1很好。
希望这可以帮助 :)
那是正确的。 如果您有4个核心,则可以一次运行4个进程。 请记住,您需要继续进行一些系统工作,将进程号定义为number_of_cores - 1
会很好。 这是首选项,不是强制性的。 对于您创建的每个进程都有开销,因此实际上您在使用更多的内存来执行此操作。 但是如果RAM没问题,那就去解决。 如果您正在运行Cuda或其他基于GPU的库,那么您将拥有不同的范例,但这是另一个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.