Python中的多线程和多处理有什么用?

Posted crazy_itman

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中的多线程和多处理有什么用?相关的知识,希望对你有一定的参考价值。

并发计算(英语:Concurrent computing,或译为并发处理、共时计算),是一种程序计算的形式,在系统中,至少有两个以上的计算在同时运作,计算结果可能同时发生。用来实现并发系统(Concurrent system)的编程语言与各种算法,统称为并发计算。并发程序通常被设计为交互式的运算过程,因为它的运算过程是不确定的,在设计上的难度较高。设计并发程序最大的挑战,在于确保不同运算执行步骤间的交互或是通信,能以正确的顺序进行,同时,也要确保在不同执行步骤间共享的资源,能够正确被访问。在这个领域的先驱人物有艾兹赫尔·戴克斯特拉、东尼·霍尔与泊·派克·汉森等人。

并发计算,简单来说,就是将一个计算任务,分割成几个小的部分,让它们同时被计算,之后再汇整计算结果,以完成任务。它跟并行计算(Parallel computing)与分布式计算,有重叠之处,在概念上不同,但常会让人混淆。并发计算是一种程序运算的特性,可以被视为是并行运算的进一步抽象,它包涵了时间片这种可以被用来实现虚拟并行运算(pseudoparallelism)的技术,因此在实际的物理运作中,计算过程可能是并行,或非并行的。并行计算是指,当并发计算的程序,在机器平台上同时被执行的状况,因此,并行计算是一种机器运算的形式之一。分布式计算(Distributed computing)则是并行计算的一个特例,它采用计算机网络来进行同步。实现并发程序有许多方式,依编程语言与操作系统的支持,可以用行程,或是线程来实现。它可以执行在单一处理器上,将不同的执行步骤分散在不同时间片中执行,以非并行方式循序运算;它也可以用并行计算来实现,将每个行程指定给处理器组中的某个处理器,以单片机多处理器平台,或是透过网络链接的分散平台来实做。

依照硬件与操作系统的支持,并发计算可以在同一个行程中完成,在同一个行程中以多线程来完成,以多个行程来达成,甚至可以分成数个程序来执行。可以用单处理器的循序计算来实现,也可以采并行计算或分布式计算方式实做。但以并行方式来运作并发程序,并不必然会增进执行效率。因为执行结果可能会因为平台特性而改变,也增加它在设计上的难度。

为什么人们更喜欢 i5 而不是 i7?没有人意识到没有多线程在现实世界中的区别吗?

自 286 以来,每个英特尔 CPU 中都存在多线程(和多任务处理)。我想你的意思是英特尔超线程技术。超线程技术(HTT)是英特尔营销术语,用于虚拟核心。HTT 将单个物理内核分成两个虚拟(假装)内核。这意味着 CPU 可以在单个内核上平均分配其任务 50/50。没有 HTT,英特尔 CPU 仍然运行多线程操作,但每个线程都在排队,并且 CPU 可以先发制人地(操作系统在安全时发出信号)或非先发制人地(CPU 决定何时切换线程)在线程之间切换。HTT 的作用是使单个内核能够并行运行两个线程堆栈。每个 HTT 线程恰好获得 CPU 核心时间的 50%,并且该时间被平分。这就是它们被称为虚拟核心的原因。如果您只有两个线程和一个内核,则可以以 CPU 最大速度的 50% 的可预测且稳定的速率运行这两个线程。如果你只有一个线程,HTT 是一种非抢占式多任务技术,它以相同的优先级运行两个线程堆栈。每个线程堆栈仍必须由操作系统通过抢占式多任务处理进行管理(假设您使用的是现代操作系统)。这可能是好事也可能是坏事。

关于 i5 和 i7,它们都支持 HTT。区别在于虚拟内核的总数。i5 有 4 个虚拟核心的硬性限制。这意味着双核 i5 具有 HTT,而四核 i5 则没有。四核 i5 将胜过双核 HTT i5,在大多数情况下胜过双核 i7。除了 HTT 之外,其他主要区别在于 i7 具有更高的基本时钟速率和更少的提升。i5 具有较低的基本时钟速率但更高的提升。明白自己需要什么的人会花更少的钱购买 i5 四核,其涡轮增压速率比同类 i7 更快,而且该系统的性能通常仅比 i7 同类产品低 1-2%,但成本会更高减少 50–100%。在某些应用程序(计算应用程序)中,i5 实际上运行得更快,因为它没有 HTT 干扰计算。在解决计算问题时,更少的线程总是比更多的线程更快,因为您没有拆分问题和合并结果的开销。如果这些线程都在同一个物理内核上,那么同时解决两个问题就不会提高性能。

带 HTT 的单核 2 Ghz CPU 与双核 1 GHz CPU 相同。只有 HTT 效率较低,因为 CPU 必须管理那些 Hyper Theeads。每个进程的行为都会不同。构建系统的一个好的经验法则是假设 HTT 在完全参与时的速度是物理内核的 90%,速度是物理内核的一半。HTT 的美妙之处不在于它们更快,因为它们并非如此,而是它们在性能方面更加一致或可预测。单个 HTT 内核上的两个线程将比非 HTT 内核上的相同两个线程运行得更流畅。但是,并没有更快。两者的总运行时间仍然几乎相同(线程队列管理会增加一些开销)

多编程、多处理和多任务之间有什么区别?

多程序设计是计算机系统能够同时执行同时加载到内存中的多个程序的能力。这就是当今大多数系统的工作方式。

多任务处理,是计算机系统能够同时执行不同任务的能力,即它具有上下文切换的能力。因此,如果您在处理文字文档时正在听音乐,则意味着您的计算机系统能够同时处理音频端口、文字处理器和音乐软件。当您处理 word 文档时,它经常会查看输出设备的缓冲区并确保它始终是预填充的。同样,它与多个其他设备及其相应的软件进行对话。

在这两种机制中,操作系统都进行时间共享。分时可以通过两种方式完成 1) 将完全划分时隙 2) 具有在请求时转移处理路径的机制。因此,处理器一次只能执行一项任务并在彼此之间切换。就像店主一样,同时处理多个客户、其员工、收银机和电话。这位店主基本上与这些“候选人”中的每一个交谈,直到需要一些时间来执行任务。就像一位想要议价的顾客正在考虑店主的报价,一名员工被派往商店拿货,另一位顾客正在掏腰包数着要付的钱等等。因此店主想方设法让候选人忙起来。

但是,如果计算机系统有两个处理器呢?这就是所谓的多处理。您所说的多线程是一种解决新技术问题的工程方法。上述分时是利用“调度中断”进行的。如果时隙是 2 秒长,这意味着每个进程一次分配 2 秒,然后调度程序中断导致操作系统从其任务列表中选择一个新进程并将其提供给处理器。但这对于最近被安排进来但由于阻塞调用而被安排出去的程序来说可能不公平。请将屏蔽电话与掌柜的技能联系起来,让大家忙个不停。由于分时系统在调度程序的时隙中工作,因此最好是同一进程的另一个组件仍然可以获得更多的处理器。这是通过多线程实现的。多线程只是一种提高处理器效率的工程方法,而其他是计算机系统的真正能力。在多处理情况下,操作系统内核有多个进程同时被提供给处理器。在 Linux 中,每个线程都被视为一个全局调度实体。多线程有三种不同的方法 - 1)用户空间 2)内核空间 3)混合。第三种现在不流行了。

Python中的多线程和多处理有什么用?

多处理和多线程都增加了系统的性能。多处理正在向系统添加更多数量的 CPU/处理器,从而提高系统的计算速度。多线程允许进程创建更多线程,从而提高系统的响应能力。我已经在下面显示的比较表的帮助下讨论了多处理和多线程之间的更多区别。

多处理的定义

多处理系统是具有两个以上处理器的系统。CPU被添加到系统中以提高系统的计算速度。每个 CPU 都有自己的一组寄存器和主存。正因为 CPU 是独立的,所以可能会出现一个 CPU 没有任何要处理的情况,可能会闲置,而另一个 CPU 可能会因进程过载。在这种情况下,进程和资源在处理器之间动态共享。

 

 

多处理可以分为对称多处理和非对称多处理。在对称多处理中,所有处理器都可以自由运行系统中的任何进程。在非对称多处理中,处理器之间存在主从关系。主处理器负责将进程分配给从处理器。如果处理器集成了内存控制器,那么添加处理器会增加系统中可寻址内存的数量。多处理可以将内存访问模型从统一内存访问更改为非统一内存访问。统一内存访问的时间与从任何处理器访问任何 RAM 的时间相同。另一方面,非统一内存访问比访问其他部分需要更长的时间来访问内存的某些部分。

多线程的定义

多线程是在该进程的上下文中同时执行单个进程的多个线程。现在让我们先讨论一下什么是线程?一个进程的线程是指一个进程的一个代码段,它有自己的线程ID、程序计数器、寄存器和堆栈,可以独立执行。但是属于同一进程的线程必须共享该进程的所有物,如代码、数据和系统资源。为每个服务请求创建单独的进程会耗费时间并耗尽系统资源。与其产生这种开销,不如创建进程的线程更有效。

 

为了理解多线程概念,让我们举一个文字处理器的例子。文字处理器显示图形,响应击键,同时继续检查拼写和语法。您不必打开不同的文字处理器来同时执行此操作。它确实在多线程的帮助下在单个文字处理器中发生。

 

现在让我们考虑一下多线程的好处。多线程提高了响应能力,就好像进程的一个线程被阻塞或执行冗长的操作一样,进程仍然继续。多线程的第二个好处是资源共享,因为进程的多个线程在同一地址空间内共享相同的代码和数据。创建线程是经济的,因为它共享它们所属进程的代码和数据。所以系统不必为每个线程单独分配资源。可以在多处理操作系统上增加多线程。由于多个 CPU 上的多线程增加了并行性。

多处理和多线程之间的主要区别

多处理和多线程之间的主要区别在于,多处理允许系统向系统添加两个以上的 CPU,而多线程允许进程生成多个线程以提高系统的计算速度。

多处理系统同时执行多个进程,而多线程系统让一个进程的多个线程同时执行。

创建进程会耗费时间,甚至会耗尽系统资源。然而,创建线程是经济的,因为属于同一进程的线程共享该进程的所有物。

多处理可以分为对称多处理和非对称多处理,而多线程没有进一步分类。

结论:

随着多处理系统上的多线程增加并行性,多线程的好处可以在多处理环境中逐渐增加。

以上是关于Python中的多线程和多处理有什么用?的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight 中的多任务和多线程

122 Python程序中的多进程和多线程

什么是多线程,多进程?

Python中的多线程并行运行

多线程与多进程的比较

多处理和多线程