📜  Python的并发性-简介

📅  最后修改于: 2020-11-08 08:40:12             🧑  作者: Mango


在本章中,我们将了解Python的并发概念,并了解不同的线程和进程。

什么是并发?

简单来说,并发是同时发生两个或更多事件。并发是自然现象,因为许多事件在任何给定时间同时发生。

就编程而言,并发是指两个任务在执行中重叠。通过并发编程,可以提高应用程序和软件系统的性能,因为我们可以并发处理请求,而不必等待上一个请求完成。

并发的历史回顾

以下几点将使我们对并发进行简要的历史回顾-

从铁路的概念

并发与铁路概念密切相关。对于铁路,需要以相同的方式在同一铁路系统上处理多列火车,以使每列火车都能安全到达目的地。

学术界中的并行计算

对计算机科学并发的兴趣始于Edsger W. Dijkstra在1965年发表的研究论文。在本文中,他确定并解决了互斥问题,即并发控制的性质。

高级并发原语

近年来,由于引入了高级并发原语,程序员正在获得改进的并发解决方案。

改进与编程语言的并发

诸如Google的Golang,Rust和Python之类的编程语言在帮助我们获得更好的并发解决方案的领域取得了令人难以置信的发展。

什么是线程和多线程?

线程是可以在操作系统中执行的最小执行单元。它本身不是程序,而是在程序中运行。换句话说,线程不是彼此独立的。每个线程与其他线程共享代码段,数据段等。它们也称为轻量级过程。

线程由以下组件组成-

  • 程序计数器,由下一条可执行指令的地址组成

  • 叠放

  • 套寄存器

  • 唯一ID

另一方面,多线程是CPU通过同时执行多个线程来管理操作系统使用的能力。多线程的主要思想是通过将一个进程划分为多个线程来实现并行性。可以在以下示例的帮助下理解多线程的概念。

假设我们正在运行一个特定的过程,其中我们打开MS Word在其中键入内容。一个线程将被分配为打开MS Word,而另一个线程将需要在其中键入内容。现在,如果我们要编辑现有的,则将需要另一个线程来执行编辑任务,依此类推。

什么是过程和多处理?

流程定义为一个实体,它表示要在系统中实现的基本工作单元。简而言之,我们将计算机程序编写在一个文本文件中,当我们执行该程序时,它成为执行程序中提到的所有任务的过程。在过程生命周期中,它经历了不同的阶段-启动,就绪,运行,等待和终止。

下图显示了流程的不同阶段-

多处理

一个进程只能有一个线程(称为主线程),也可以有多个线程,它们具有自己的一组寄存器,程序计数器和堆栈。下图将向我们展示差异-

多处理一

另一方面,多处理是在单个计算机系统中使用两个或多个CPU单元。我们的主要目标是从我们的硬件中获得最大的潜力。为此,我们需要利用计算机系统中可用的CPU核心总数。多重处理是最好的方法。

多处理二

Python是最流行的编程语言之一。以下是使其适用于并发应用程序的一些原因-

句法糖

语法糖是一种编程语言中的语法,旨在使事物更易于阅读或表达。它使语言成为供人使用的“更甜”的语言:可以更清晰,更简洁地表达事物,也可以根据喜好以其他方式表达事物。 Python带有Magic方法,可以将其定义为对对象起作用。这些Magic方法用作语法糖,并绑定到更易于理解的关键字。

大型社区

Python语言在AI,机器学习,深度学习和定量分析等领域的数据科学家和数学家中得到了广泛的采用。

并发编程的有用API

Python 2和3具有大量专用于并行/并发编程的API。其中最流行的是线程,并发功能,多处理,异步,gevent和greenlets等。

Python在实现并发应用程序方面的局限性

Python对并发应用程序有一个限制。这种限制称为Python存在的GIL(全局解释器锁定) 。 GIL从未允许我们利用CPU的多个内核,因此我们可以说Python中没有真正的线程。我们可以理解GIL的概念如下-

GIL(全局翻译锁定)

它是Python世界中最有争议的主题之一。在CPython中,GIL是互斥锁-互斥锁,这使线程安全。换句话说,我们可以说GIL阻止了多个线程并行执行Python代码。一次只能由一个线程持有该锁,如果我们要执行一个线程,则它必须首先获取该锁。下面显示的图表将帮助您了解GIL的工作原理。

局限性

但是, Python有一些库和实现,例如Numpy,JpythonIronPytbhon。这些库可以正常工作,而无需与GIL进行任何交互。