我可以在单个核心机器上运行多处理Python程序吗?

use*_*151 10 python multiprocessing python-multiprocessing

所以这或多或少是一个理论问题.我有一个核心机器,据说功能强大,但只有一个核心.现在我有两个选择:

  1. 多线程:就我的知识而言,即使我因为GIL而拥有它们,我也无法在我的机器中使用多个内核.因此,在这种情况下,它没有任何区别.

  2. 多处理:这是我怀疑的地方.我可以在单个核心机器上进行多处理吗?或者每次我必须检查我的机器中可用的核心,然后运行完全相同或更少数量的进程?

有人可以指导一下机器中多处理和核心之间的关系.

我知道这是一个理论问题,但我的概念对此并不十分清楚.

tim*_*geb 7

这是一个很大的话题,但这里有一些提示。

  • 将线程视为共享相同地址空间并可以访问相同内存的进程。通信是通过共享变量完成的。多个线程可以在同一个进程中运行。
  • 进程(在这种情况下,粗略地说)有自己的私有数据,如果两个进程想要通信,则必须更明确地进行通信。
  • 当您编写一个瓶颈是 CPU 周期的程序时,线程或进程都不会在单核机器上为您提供加速。
  • 进程和线程对于多任务处理((子)程序之间的快速切换)仍然很有用 - 这就是您的操作系统所做的,因为它运行的进程远远多于您拥有的内核。
  • 如果您正在执行的任务受 I/O 限制,进程和线程(甚至协程!)甚至可以在单核机器上为您提供相当大的加速 - 想想从网络获取数据。例如,不是主动等待数据发送或到达,另一个进程或线程可以发起下一个网络操作。
  • 当您不需要显式封装时,线程比进程更可取,因为它们的开销较低。对于大多数受 CPU 限制的并发问题,尤其是“令人尴尬的并行”问题的大子集,产生比处理器多的进程没有多大意义。
  • Python GIL 防止同一进程中的两个线程并行运行,即多个内核同时执行指令。
  • 因此,Python 中的线程对于加速 CPU 密集型任务相对无用,但对于 I/O 密集型任务仍然非常有用,因为阻塞操作(例如等待网络数据)释放了 GIL,这样另一个线程可以同时运行另一个线程等待。
  • 如果你有多个处理器,你可以通过生成多个进程来获得真正的并行性,尽管 GIL。这仅适用于 CPU 密集型任务,并且通常您必须考虑生成进程的开销和进程之间的通信成本。