假设我有一个需要花费几秒钟来计算的函数,并且我有8个CPU(根据multiprocessing.cpu_count()
)。
当我启动此过程少于8次且超过8次时会发生什么?
当我尝试执行此操作时,我观察到即使启动20个进程,它们都在并行运行。我希望它们一次运行8个,其他人将等待它们完成。
答案 0 :(得分:1)
会发生什么情况取决于底层操作系统。
但是通常有两件事:物理cpu核心和线程/进程(所有主要系统都有)。操作系统会跟踪称为线程/进程(其中包括要执行的代码)的抽象事物,并在给定时间内将其映射到某个cpu内核,直到调用某些syscall(例如网络访问)为止。如果您有更多的线程,然后有内核(通常是这种情况,现代操作系统的后台运行着很多东西),那么其中有些等待上下文切换(即轮到他们)。
现在,如果您有CPU密集型任务(困难的计算),那么运行8个以上的线程/进程将看不到任何好处。但是即使您这样做,他们也不会一个接一个地运行。操作系统将在某个时间点中断CPU内核,以允许其他线程运行。因此,操作系统将混合执行:一点点,一点点。这样,每个线程/进程都会缓慢进行,不会永远等待。
另一方面,如果您的任务受io约束(例如,您进行HTTP调用以便等待网络),那么拥有20个任务将提高性能,因为当这些线程等待io时,操作系统会将这些线程置于保持状态,将允许其他线程运行。这些其他线程也可以执行io,这样您就可以实现更高的并发水平。