Python中的并发 - 简介

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

什么是并发?

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

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

并发的历史回顾

以下几点将为我们提供并发和减去的简要历史回顾;

来自铁路的概念

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

学术界的并行计算

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

高级并发原语

最近,由于引入了高级并发原语,程序员正在改进并发解决方案.

使用编程语言提高并发性

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

什么是线程和多线程?

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

一个线程包含以下组件 :

  • 程序计数器,包含下一个可执行指令的地址

  • 堆栈

  • 寄存器组

  • 唯一ID

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

示例

假设我们正在运行一个特定的进程,其中我们打开MS Word输入内容.将分配一个线程来打开MS Word,并且需要另一个线程在其中键入内容.现在,如果我们想要编辑现有的,那么另一个线程将需要执行编辑任务等等.

什么是流程&多处理?

进程被定义为一个实体,它代表了要在系统中实现的基本工作单元.简单来说,我们将计算机程序写入文本文件中,当我们执行该程序时,它将成为执行程序中提到的所有任务的过程.在过程生命周期中,它经过不同的阶段 - 开始,就绪,运行,等待和终止.

下图显示了过程的不同阶段 :

多处理

一个进程只能有一个线程,称为主线程,或多个线程有它们的自己的寄存器,程序计数器和堆栈.下图将向我们展示差异 :

Multiprocessing One

多处理,另一方面,是在单个计算机系统中使用两个或更多CPU单元.我们的主要目标是充分发挥硬件的潜力.为此,我们需要利用计算机系统中可用的全部CPU内核.多处理是最好的方法.

Multiprocessing Two

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

语法糖

语法糖是编程语言中的语法,旨在使事物更容易阅读或表达.它使语言"更甜"供人类使用:事物可以更清晰,更简洁地表达,或者基于偏好的替代风格. Python附带了Magic方法,可以定义它们作用于对象.这些Magic方法用作语法糖并绑定到更容易理解的关键字.

大型社区

Python语言已经见证了大量采用数据科学家和数学家之间的比率,在人工智能,机器学习,深度学习和定量分析领域工作.

用于并发编程的有用API

Python 2和3拥有大量专用于并行/并发编程的API.其中最受欢迎的是线程,并发.功能,多处理,asyncio,gevent和greenlets,等.

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

Python带有并发应用程序的限制.这种限制称为 GIL(全局解释器锁)存在于Python中. GIL从不允许我们使用多个CPU核心,因此我们可以说Python中没有真正的线程.我们可以理解GIL的概念如下 :

GIL(全局解释器锁)

这是Python中最具争议的话题之一世界.在CPython中,GIL是互斥锁 - 互斥锁,它使线程安全.换句话说,我们可以说GIL阻止多个线程并行执行Python代码.锁一次只能由一个线程保存,如果我们想要执行一个线程,那么它必须首先获取锁.下面的图表将帮助您了解GIL的工作情况.

Limitations

但是,Python中有一些库和实现,例如 Numpy,Jpython IronPytbhon.这些库可以在不与GIL进行任何交互的情况下工作.