Python:`multiprocessing.Process(...)。start()`是否在同一个cpu上启动所有进程?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (331)

假设我有一个需要几秒钟计算的功能,我有8个CPU(根据multiprocessing.cpu_count())。

当我开始这个过程少于8次且超过8次时会发生什么?

当我尝试这样做时,我观察到即使我开始了20个进程,它们都是并行运行的。我希望他们一次运行8个,其他人则等待他们完成。

提问于
用户回答回答于

发生的事情取决于底层操作系统。

但通常有两件事:物理cpu核心和线程/进程(所有主要系统都有它们)。操作系统会跟踪这个称为线程/进程的抽象事物(其中包含要执行的代码)并将其映射到某个cpu核心一段时间或直到调用某些系统调用(例如网络访问)。如果你有更多的线程然后核心(通常是这种情况,在现代操作系统的后台运行很多东西),然后其中一些等待上下文切换发生(即轮到他们)。

现在,如果您有cpu密集型任务(硬计算),那么在运行8个以上的线程/进程时,您将看不到任何好处。但即使你这样做,他们也不会一个接一个地跑。操作系统将在某个时刻中断CPU核心以允许其他线程运行。因此操作系统将混合执行:一点点,一点点。这样每个线程/进程都会慢慢地进展,并且不会永远等待。

另一方面,如果您的任务受到约束(例如,您进行HTTP调用以便等待网络),则执行20个任务将提高性能,因为当这些线程等待io时,操作系统将保留这些线程并允许其他线程线程运行。而那些其他线程也可以做到这一点,这样你就可以实现更高级别的并发性。

扫码关注云+社区

领取腾讯云代金券