代码之家  ›  专栏  ›  技术社区  ›  Subhayan Bhattacharya

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

  •  6
  • Subhayan Bhattacharya  · 技术社区  · 6 年前

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

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

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

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

    3 回复  |  直到 6 年前
        1
  •  7
  •   timgeb    6 年前

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

    • 进程(在这个上下文中,粗略地说)有它们自己的私有数据,如果两个进程想要通信,那么必须更明确地进行通信。
    • 当您编写一个瓶颈是CPU周期的程序时,线程或进程都不会在单核机器上给您带来加速。
    • 进程和线程对于多任务处理(在(子)程序之间快速切换)仍然有用——这是操作系统所做的,因为它运行的进程远远多于内核。
    • 当由于线程开销较低而不需要显式封装时,线程比进程更可取。对于大多数CPU受限的并发问题,尤其是 embarassingly parallel “首先,产生的进程比拥有的处理器多没有多大意义。
    • Python GIL防止同一进程中的两个线程并行运行,即多个内核同时执行指令。
    • 如果您有多个处理器,那么您可以通过生成多个进程来实现真正的并行性,尽管有GIL。这只适用于CPU受限的任务,而且通常需要考虑生成进程的开销和进程之间的通信开销。
        2
  •  2
  •   norok2    6 年前

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

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

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

        3
  •  1
  •   Santosh Kumar RVG    6 年前

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

    threading


    你似乎混淆了多重处理和线程 (您指的是多线程) 和X核处理器。

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

    另请参见: PyPy implementation of Python