如果我运行一个python脚本,其中我声明6个进程使用多进程,但我只有4个CPU内核,会发生什么额外的2个进程可以找到一个专用的CPU内核
- 它们是如何执行的? 如果两个额外的进程作为单独的线程在现有的核心上运行,GIL不会停止它们的执行吗?
#编辑1 - 2021年1月21日
在我问的问题中,我混淆了线程和进程。由于我对这个概念有更清晰的理解,我将把问题2重新表述如下(以备将来参考):如果两个额外的进程在现有的内核中与其他两个进程并行运行,GIL不会停止它们的执行吗?
Ans: GIL不影响进程,GIL一次只允许一个线程运行,但是对进程没有限制。系统调度程序管理额外的两个进程如何在现有的内核上运行。
首先,你混淆了线程和进程:在Python中,只有线程而不是进程必须在它们的解释器上共享一个锁。如果你使用的是multiprocessing库,那么你使用的是有自己解释器的Python进程。
当你使用Python进程时,它们的执行是由你的操作系统调度程序管理的,就像你计算机上的其他进程一样。如果进程数超过CPU核数,那么额外的进程将在后台等待调度。这通常发生在其他进程终止、等待IO或周期性时钟中断时。
确保使用
始终是最佳实践pool = multiprocessing.Semaphore(multiprocessing.cpu_count() - 1)
#this will detect the number of cores in your system and creates a semaphore with that value.
当您创建一个进程时,它需要开销来管理它、它的内存空间和它的共享内存。此外,操作系统必须运行,所以让一个核心空闲总是礼貌的,而且会加快问题的执行速度。