所以这或多或少是一个理论问题。我有一台单核机器,据说很强大,但只有一个核心。现在我有两个选择:
-
多线程:就我所知,即使由于GIL的原因,我也无法在机器中使用多个内核。因此,在这种情况下,没有任何区别。
-
多处理器:这是我有疑问的地方。我可以在单核机器上进行多处理吗?或者每次我必须检查机器中可用的核心,然后运行完全相同或更少数量的进程?
有人能告诉我机器中多处理和核心之间的关系吗。
我知道这是一个理论问题,但我的概念不是很清楚。
这是一个大主题,但这里有一些指针。
- 将线程视为共享相同地址空间并可以访问相同内存的进程。通信是通过共享变量完成的。多个线程可以在同一进程中运行
- 进程(在这种情况下,粗略地说)有自己的私有数据,如果两个进程想要通信,则必须更明确地进行通信
- 当你在写一个瓶颈是CPU周期的程序时,线程或进程都不会在单核机器上给你加速
- 进程和线程对于多任务处理(在(子)程序之间快速切换)仍然很有用——这就是你的操作系统所做的,因为它运行的进程远远多于你的核心
- 如果您正在执行的任务是I/O绑定的,那么即使在单核心机器上,进程和线程(甚至协程!)也可以为您提供相当大的速度提升——想想从网络中获取数据吧。例如,另一个进程或线程可以启动下一个网络操作,而不是主动等待数据发送或到达
- 当您不需要显式封装时,线程比进程更可取,因为它们的开销较低。对于大多数CPU绑定的并发问题,尤其是"令人尴尬的并行"问题的大个子集,生成比处理器更多的进程没有多大意义
- Python GIL防止同一进程中的两个线程并行运行,即多个内核同时执行指令
- 因此,Python中的线程对于加速CPU绑定的任务相对无用,但对于I/O绑定的任务仍然非常有用,因为阻塞操作(例如等待网络数据)释放了GIL,使得另一个线程可以在另一个等待时运行
- 如果您有多个处理器,则可以通过生成多个进程来实现真正的并行性,而不考虑GIL。这只适用于CPU受限的任务,而且通常您必须考虑生成进程的开销和进程之间的通信成本
您可以在单核系统中同时使用多线程和多处理。
GIL限制了纯Python中多线程在计算绑定任务中的作用,无论您的底层架构如何。对于I/O绑定的任务,它们确实可以很好地工作。如果它们没有任何用处,很可能一开始就不会实施。
对于纯Python软件来说,当涉及到并行计算时,多处理总是一个更安全的选择。当然,多个进程比多个线程更昂贵(因为与线程相反,进程不共享内存;而且,与线程相比,进程的开销略高)。
然而,对于单处理器机器来说,多处理(和多线程)几乎不会为计算量大的任务带来额外的速度,而且它们实际上甚至会让你慢一点。但是,如果操作系统支持它们(这在台式机、工作站、集群等中很常见,但在嵌入式系统中可能不常见),它们允许您有效地同时运行多个I/O绑定程序。
长话短说,这在一定程度上取决于你在做什么。。。
多处理模块基本上会产生多个python解释器实例,因此不必担心GIL。
多处理使用与线程模块相同的API,如果您以前使用过它的话。
您似乎混淆了多处理、线程(您指的是多线程)和X-core处理器。
- 不管怎样,当您启动Python(CPython实现)时,它将只使用处理器的一个核心
- 线程化是在脚本的不同组件之间分配负载。假设您必须与外部API交互,那么您的脚本必须等待通信完成,直到下一步继续。你已经打了多个类似的电话,这将需要线性时间。而如果使用线程,则可以并行地执行这些调用
另请参阅:Python 的PyPy实现