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

2024-10-01 17:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

所以这或多或少是一个理论问题。我有一个单核心的机器,它被认为是强大的,但无论如何只有一个核心。现在我有两个选择:

  1. 多线程:就我所知,我不能在我的机器上使用多核,即使我有它们,因为GIL。因此,在这种情况下,这没有任何区别。

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

有人能告诉我多处理和机器核心之间的关系吗。在

我知道这是一个理论问题,但我的概念不太清楚。在


Tags: 机器概念核心关系进程地方情况理论
3条回答

您可以在单核系统中同时使用多线程和多处理。在

GIL限制了纯Python中的多线程对于计算受限任务的有用性,无论您的底层架构如何。对于I/O绑定的任务,它们工作得非常好。如果它们没有任何用处,它们可能一开始就不会得到实施。在

对于纯Python软件,当涉及到并行计算时,多处理总是一个更安全的选择。当然,多个进程比多个线程更昂贵(因为进程不共享内存,与线程相反;而且,与线程相比,进程的开销稍高一些)。在

然而,对于单处理器计算机,多处理(和多线程处理)对计算繁重的任务几乎没有额外的速度,它们甚至应该会让你慢一点。但是,如果操作系统支持它们(这对于桌面、工作站、集群等非常常见,但对于嵌入式系统可能不常见),它们允许您有效地同时运行多个I/O绑定的程序。在

长话短说,这有点取决于你在做什么。。。在

multiprocessing模块基本上产生了python解释器的多个实例,因此不必担心GIL。在

如果您以前使用过threading模块,则多处理使用的API与此相同。在


您似乎混淆了多处理、线程(您称之为多线程)和X核处理器。在

  • 不管怎样,当您启动Python(CPython实现)时,它将只使用处理器的一个核心。在
  • 线程是在脚本的不同组件之间分配负载。假设您必须与外部API交互,脚本必须等待通信完成,直到下一步继续。你已经打了多个类似的电话,这需要线性时间。而如果使用线程,则可以并行执行这些调用。在

另请参见:PyPy implementation of Python

这是一个很大的话题,但这里有一些建议。在

  • 把线程看作是共享相同地址空间并可以访问相同内存的进程。通信是由共享变量完成的。多个线程可以在同一进程中运行。在
  • 进程(在这个上下文中,粗略地说)有它们自己的私有数据,如果两个进程想要通信,那么通信必须更明确地进行。在
  • 当您在编写一个瓶颈是CPU周期的程序时,线程或进程都不会给您在单核机器上的加速。在
  • 进程和线程对于多任务处理(在(子)程序之间快速切换)仍然是有用的——这是您的操作系统所做的,因为它运行的进程远远多于内核。在
  • 进程和线程(甚至是协同进程!)如果您正在执行的任务是I/O绑定的,那么即使在单核机器上也可以给您带来相当大的加速—比如从网络中获取数据。例如,另一个进程或线程可以启动下一个网络操作,而不是主动等待数据的发送或到达。在
  • 当不需要显式封装时,线程比进程更可取,因为它们的开销较低。对于大多数与CPU相关的并发问题,特别是“embarassingly parallel”问题的大子集,生成的进程多于处理器是没有意义的。在
  • pythongil防止同一进程中的两个线程并行运行,即多个内核同时执行指令。在
  • 因此,Python中的线程对于加速CPU绑定的任务相对无用,但是对于I/O绑定的任务仍然非常有用,因为阻塞操作(例如等待网络数据)释放GIL,使得另一个线程可以在其他线程等待时运行。在
  • 如果您有多个处理器,您可以通过生成多个进程来实现真正的并行性,尽管GIL很复杂。这只对CPU受限的任务是值得的,而且通常您必须考虑生成进程的开销和进程之间的通信开销。在

相关问题 更多 >

    热门问题