选择多处理的进程数时是否有任何指导原则?

Los*_*oul 13 python parallel-processing multiprocessing

我刚刚尝试了多处理(并且非常棒!),但我想知道是否有任何指导来选择进程数量?它只是基于服务器上的核心数量?它是以某种方式基于应用程序运行(循环次数,它使用多少CPU等)?等...我如何决定产生多少个进程?现在,我只是猜测并添加/删除流程,但如果有某种指导方针或最佳实践,那将会很棒.

另一个问题,我知道如果我添加太少会发生什么(程序是slooow)但是如果我添加'太多'怎么办?

谢谢!

phi*_*hag 13

如果所有线程/进程确实都受CPU限制,那么您应该运行与CPU报告核心一样多的进程.由于超线程,每个物理CPU核心可能能够呈现多个虚拟核心.调用multiprocessing.cpu_count以获取虚拟核心的数量.

如果只有1个线程中的p是CPU绑定的,则可以通过乘以p来调整该数量.例如,如果一半的进程受CPU限制(p = 0.5),并且您有两个CPU,每个CPU有4个内核和2x超线程,则应该启动0.5*2*4*2 = 8个进程.

如果您的进程太少,您的应用程序将比预期的运行速度慢.如果您的应用程序完美地扩展并且仅受CPU限制(即,在以10倍的内核数量执行时执行速度快10倍),这意味着您的速度相对较慢.例如,如果您的系统需要8个进程,但只启动4个进程,那么您将只使用一半的处理能力并且需要两倍的时间.请注意,在实践中,没有应用程序可以完美地扩展,但有些(光线跟踪,视频编码)非常接近.

如果进程太多,则同步开销会增加.如果您的程序几乎没有同步开销,这不会影响整个运行时,但可能会使其他程序看起来比它们慢,除非您将进程设置为较低的优先级.如果您的操作系统具有良好的调度程序,理论上过多的进程(例如,10000)就可以了.实际上,几乎任何同步都会使开销难以忍受.

如果您不确定您的应用程序是否受CPU限制和/或完美缩放,只需观察具有不同线程数的系统负载.您希望系统负载略低于100%,或者更准确的正常运行时间为虚拟核心数.

  • 只是添加到观察部分:您显然希望避免由于同步开销而导致CPU利用率增加.因此,在进行实验时,您应该测量系统负载和应用程序吞吐量. (2认同)