我可以在一台核心计算机上运行多处理Python程序吗?

时间:2018-09-23 10:44:00

标签: python multiprocessing python-multiprocessing

所以这或多或少是一个理论问题。我有一台功能强大的单核计算机,但是却只有一个核。现在我有两个选择:

  1. 多线程处理:就我所知,即使我由于GIL而拥有多个内核,也无法在我的计算机中使用多个内核。因此,在这种情况下,它没有任何区别。

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

有人可以指导我有关机器中多处理与内核之间的关系。

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

3 个答案:

答案 0 :(得分:2)

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

无论您的基础体系结构如何,GIL都限制了纯Python中多线程对计算绑定任务的有用性。对于受I / O约束的任务,它们确实可以很好地工作。如果它们没有任何用处,那么可能一开始就不会实现。

对于纯Python软件,在并行计算方面,多处理始终是一个更安全的选择。当然,多个进程比多个线程更昂贵(因为与线程相反,因为进程不共享内存,而且与线程相比,进程的开销略高)。

但是,对于单处理器计算机,多处理(和多线程)在处理繁重的任务时几乎没有增加额外的速度,实际上它们甚至会使您变慢。但是,如果操作系统支持它们(在台式机,工作站,集群等中很常见,但在嵌入式系统中可能并不常见),则它们使您可以有效地同时运行多个受I / O约束的程序。

长话短说,这取决于您在做什么...

答案 1 :(得分:1)

multiprocessing模块基本上会产生多个python解释器实例,因此无需担心GIL。

多重处理使用的是threading模块所使用的相同API,如果您以前曾使用过。


您似乎对多处理,线程(您指的是多线程)和X核处理器感到困惑。

  • 无论如何,当您启动Python (CPython实现)时,它将仅使用处理器的一个内核。
  • 线程在脚本的不同组件之间分配负载。假设您必须与外部API进行交互,则脚本必须等待通信完成,直到下一步进行。您正在进行多个类似的呼叫,这将花费线性时间。而如果您使用线程,则可以并行进行这些调用。

另请参阅:PyPy implementation of Python

答案 2 :(得分:1)

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

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