在本章中,我们将理解Python中的并发概念,并了解线程和进程的区别。
什么是并发?
简而言之,并发是指同时发生两个或多个事件。 并发是一种自然现象,因为许多事件在任何给定的时间同时发生。
就编程而言,并发是两个任务在执行过程中重叠的时候。 通过并发编程,我们的应用程序和软件系统的性能可以得到提高,因为我们可以同时处理请求,而不是等待前一个完成再处理下一个。
并发性的历史回顾
以下几点将给我们简要的并发历史回顾 -
铁路概念
并发性与铁路概念密切相关。 有了铁路,就需要在同一条铁路系统上处理多列火车,以便每列火车都能安全到达目的地。
并行计算在学术界
对计算机科学并发性的兴趣始于1965年由Edsger W. Dijkstra发表的研究论文。在本文中,他确定并解决了互斥问题,即并发控制的性质。
高级并发基元
最近,由于引入了高级并发基元,程序员正在改进并发解决方案。
改进了编程语言的并发性
Google的Golang,Rust和Python等编程语言在帮助我们获得更好的并发解决方案的领域取得了令人难以置信的发展。
什么是线程和多线程?
线程是可以在操作系统中执行的最小执行单元。 它本身不是一个程序,而是在程序中运行。 换句话说,线程并不相互独立。 每个线程与其他线程共享代码段,数据段等。 他们也被称为轻量级流程。
一个线程由以下组件组成 -
- 程序计数器由一个可执行指令的地址组成
- 堆
- 寄存器组
- 唯一的ID
多线程,在另一方面,是CPU的通过同时执行多个线程管理使用操作系统的能力。 多线程的主要思想是通过将进程分成多个线程来实现并行性。 以下示例的帮助理解多线程的概念。
示例
假设我们正在运行一个特殊的过程,在这个过程中我们打开MS Word来输入内容。 一个线程将被分配以打开MS Word,另一个线程将需要在其中输入内容。 而现在,如果要编辑现有的文档内容,那么将需要另一个线程来执行编辑任务等等。
什么是进程和多进程?
进程被定义为一个实体,它代表了系统中要实施的基本工作单元。 简而言之,我们将计算机程序编写成文本文件,当我们执行这个程序时,它就成为执行程序中提到的所有任务的过程。 在进程生命周期中,它经历了不同的阶段 - 开始,准备,运行,等待和终止。
下图显示了一个过程的不同阶段 -
一个进程只能有一个线程,称为主线程,或者多线程拥有自己的一组寄存器,程序计数器和堆栈。 以下图表显示了它们的区别 -
另一方面,多进程是在一个计算机系统内使用两个或多个CPU单元。 我们的主要目标是充分利用我们的硬件。 为了实现这一点,我们需要利用我们的计算机系统中可用的全部CPU核心。 多多进程是最好的方法。
Python是一种最流行的编程语言。 以下是一些适合并发应用的原因 -
语法糖
语法糖是一种编程语言中的语法,旨在使事情更容易阅读或表达。 它使语言“更甜”供人类使用:事物可以更清晰,更简洁地表达,或以偏好为基础的另一种风格表达。 Python带有Magic方法,可以将其定义为对对象起作用。 这些Magic方法被用作语法糖,并绑定到更容易理解的关键字。
社区庞大
Python语言在AI,机器学习,深度学习和定量分析领域的数据科学家和数学家之间见证了大量采用率。
并发编程的API
Python 2和3有大量专用于并行/并发编程的API。 其中最受欢迎的是:threading
,multiprocessing
,asyncio
,gevent
和greenlets
等。
Python在实现并发应用程序中的局限性
Python对并发应用程序有一个限制。 这种限制称为GIL(全局解释器锁),它存在于Python中。 GIL从来不允许我们利用CPU的多个内核,因此可以说Python中没有真正的线程。 我们可以理解GIL的概念如下 -
GIL(全局解释器锁)
这是Python世界中最具争议的话题之一。 在CPython中,GIL是互斥锁 - 互斥锁,它使线程安全。 换句话说,我们可以说GIL阻止了多个线程并行执行Python代码。 锁一次只能由一个线程保存,如果想执行一个线程,那么它必须先获取锁。下面的图表将帮助您了解GIL的工作。
但是,Python中有一些库和实现,如:Numpy,Jpython和IronPytbhon。 这些库与GIL没有任何交互。