介绍

优质
小牛编辑
129浏览
2023-12-01

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

什么是并发?

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

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

并发的历史回顾

以下几点将为我们提供并发的简要历史回顾 -

从铁路的概念

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

学术界的并行计算

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

高级并发原语

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

使用编程语言改进了并发性

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

什么是线程和多线程?

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

线程由以下组件组成 -

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

  • Stack

  • 寄存器集

  • 一个独特的身份

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

例子 (Example)

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

什么是流程和多处理?

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

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

多

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

多处理一

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

多处理二

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

句法糖

语法糖是编程语言中的语法,旨在使事物更易于阅读或表达。 它使语言“更甜”供人类使用:事物可以更清晰,更简洁地表达,或者根据偏好以另一种方式表达。 Python附带了Magic方法,可以定义它们作用于对象。 这些Magic方法被用作语法糖并绑定到更易于理解的关键字。

大社区

Python语言已经见证了数据科学家和数学家的大量采用率,他们在AI,机器学习,深度学习和定量分析领域工作。

用于并发编程的有用API

Python 2和3拥有大量专用于并行/并发编程的API。 其中最受欢迎的是threading, concurrent.features, multiprocessing, asyncio, gevent and greenlets,等。

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

Python对并发应用程序有限制。 这种限制在Python中存在,称为GIL (Global Interpreter Lock) 。 GIL从不允许我们使用多个CPU内核,因此我们可以说Python中没有真正的线程。 我们可以理解GIL的概念如下 -

GIL (Global Interpreter Lock)

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

限制

但是,Python中有一些库和实现,如Numpy, JpythonIronPytbhon. 这些库在没有与GIL交互的情况下工作。