1.2 异步相关概念:深入了解

news/2024/7/7 15:33:55 标签: python, 多进程多线程, 异步, 进程池, 线程池

1.同步(Synchronous) VS 异步(Asynchronous)

所谓同步,可以理解为每当系统执行完一段代码或者函数后,系统将一直等待该段代码或函数返回的值或消息,直到系统接收到返回的值或消息后才继续往下执行下一段代码或者函数,在等待返回值或消息的期间,程序处于阻塞状态,系统将不做任何事情。

异步则恰恰相反,系统在执行完一段代码或者函数后,不用阻塞性地等待返回的值或消息,而是继续执行下一段代码或函数,在同一时间段里执行多个任务(而不是傻傻的等着一件事情做完并且直到结果出来了以后才去做下件事情),将多个任务并发(注意不是并行),从而提高程序的执行效率。如果你有读过数学家华罗庚的《统筹方法》,一定不会对其中所举的例子感到陌生:同样是沏茶的步骤,因为烧水需要一段时间,你不用等水煮沸了过后才来洗茶杯、倒茶叶(类似“同步”),而是在等待烧水的过程中就把茶杯洗好,把茶叶倒好,等水烧开了就能直接泡茶喝了,这里烧水、洗茶杯、倒茶叶三个任务是在同一个时间段内并发完成的,这就是一种典型的“异步”。

paramiko, netmiko, telnetlib, pexpect, ciscolib等第三方模块默认都是基于同步的,基于异步的模块有asyncio, asyncping, netdev等等(pexpect也支持异步,但是必须手动调,默认状态下是同步)。

  • 进程之下是线程,线程之下是协程。
  • 多进程、多线程、协程都统称异步

2.线程(Thread) VS 进程(Process)

所谓线程是指操作系统能够进行运算调度的最小单位。线程依托于进程存在,是进程中的实际运作单位,一个进程可以有多个线程,每条线程可以并发执行不同的任务。

3.单线程(Single Threaded) VS 多线程 (Multi Threaded)

引用同样的例子来说明单线程和多线程的区别。

在上面讲到的华罗庚《统筹方法》里沏茶的这个例子中,如果只有一个人来完成烧水、洗茶杯、倒茶叶三项任务的话,因为此时只有一个劳动力,就可以把它看成是单线程(同步、异步IO都是基于单线程的)。假设能找来三个人分别负责烧水、洗茶杯、倒茶业,那就可以把它看成是多线程,每一个劳动力代表一个线程,但是由于多线程的Global Interpreter Lock机制(俗称的GIL全局锁)的存在,实际上这三个劳动力并不是同时开工的,从并发的性能和效率的角度来看,多线程实际上是弱于基于单线程的异步IO的。

4.异步IO和多线程之间的区别

异步IO是单线程,而多线程顾名思义就是多个线程。

异步IO和多线程的区别在于它们的机制不一样,多线程使用的是抢占式多任务处理(Pre-emptive Multitasking) 。在这种抢占式环境下,操作系统本身具有掌控所有任务(也就是程序)的能力,能随心所欲地剥夺每个任务的时间片来提供给其他任务,也就是有一个幕后大boss掌控一切。而异步IO的机制为协作式多任务处理(Cooperative Multitasking), 这种机制没有幕后大boss,在协作式环境下,每个任务被调度的前提是当前任务主动放弃时间片。

异步IO的核心是协程(Coroutine),这个是多线程不具备的。协程是一种轻量级线程,它是一种特殊的生成器函数,它可以在return语句被执行前停止该函数当前正在执行的任务,并且能在一段时间内间接地将执行权交给另外一个协程函数。协程强调的是合作,而不是多线程强调的抢占,asyncio是Python中唯一支持协程的标准库。

5.并发(Concurrent) VS 并行 (Parallesim)

并发是一个笼统的概念,在Python里,在逻辑上同时发生的任务有多种称谓:多线程,异步IO(多任务),多进程,它们都是并发的一种。深入地说,只有调用多核CPU的多进程(Multiprocessing)是用来处理在物理上同时发生的任务的,这个叫并行。基于单核CPU的多线程和异步IO(多任务)同一时间内只能处理一件事件(但是它们有自己独特的机制来加快处理不同事件的能力),这个叫做并发。

举例子来说明同步、并发、并行三者之间的区别。当你喝茶的时候突然有人给你打电话,如果此时你:

  • 不接听电话,继续喝茶,等把茶喝完过后再来回电话,这个叫做同步。
  • 接听电话后放下杯子停止喝茶,等通话完毕后再接着喝,这个叫做并发。
  • 接听电话的同时继续喝茶,这个叫做并行。

并行是并发的一种,但是并发并不等于并行。详细请看:异步相关概念:初步了解

6. I/O密集型(I/O bound) VS CPU密集型(CPU bound)

  • I/O密集型(I/O bound) 是指不会特别消耗 CPU
    资源,但是I/O比较频繁的任务和操作,比如文件的读写、网络通信、数据库访问等等。
    CPU密集型(CPU bound)是指需要大量耗费CPU资源的任务和操作,比如计算、解压缩、加密解密等等。

异步和多线程适合I/O密集型场景, 多进程适合CPU密集型场景。

7.锁和共享内存

【多线程、多进程涉及IO和共同变量必须要用锁,一定要用】

(1)多线程的线程锁

①死锁问题和解决
如果多个线程要调用多个现象,而A线程调用A锁占用了A对象,B线程调用了B锁占用了B对象,A线程不能调用B对象,B线程不能调用A对象,于是一直等待。这就造成了线程“死锁”。Threading模块中,也有一个类,RLock,称之为可重入锁。该锁对象内部维护着一个Lock和一个counter对象。counter对象记录了acquire的次数,使得资源可以被多次require。最后,当所有RLock被release后,其他线程才能获取资源。在同一个线程中,RLock.acquire可以被多次调用,利用该特性,可以解决部分死锁问题

②当多个线程同时访问一个数据时,需加锁,排队变成单线程一个一个执行,避免出错。
③加锁避免并发导致逻辑出错。

④每当一个线程a要访问共享数据时,必须先获得锁定;如果已经有别的线程b获得锁定了,那么就让线程a暂停,也就是同步阻塞;等到线程b访问完毕,释放锁以后,再让线程a继续。

⑤同一时刻只允许一个线程操作该数据,可以保证数据安全。
线程锁用于锁定资源,可以同时使用多个锁,当需要独占某一资源时,任何一个锁都可以锁这个资源。

⑥将一段代码锁住,一旦获得锁权限,除非释放线程锁,否则其他代码都无法获得锁权限。

(2)多进程的进程锁

①很多时候,需要在多个进程中同时写一个文件,如果不加锁机制,就会导致写文件错乱。
②谁先抢到锁谁先执行,等到该进程执行完成后,其它进程再抢锁执行。
python多进程编程使用进程池非常的方便管理进程,但是有时候子进程之间会抢占一些独占资源,比如consol或者比如日志文件的写入权限,这样的时候我们一般需要共享一个Lock来对独占资源加锁。

8. 详细表格

在这里插入图片描述


http://www.niftyadmin.cn/n/14461.html

相关文章

C#连接到SQL Server数据库

理论知识 使用ADO.NET(ActiveX Data Objects)可以减少不同数据库系统带来的琐碎事情。 ADO.NET是一组公开数据访问服务的类。 主要组成: .NET 数据提供程序:可以实现数据操作和对数据的快速,只进只读访问。DataSet (数据集):A…

Chrome安装油猴插件详细教程

Chrome安装油猴插件详细教程 一、油猴安装方法 方法一:Google官方商店安装(推荐,需要科学上网) 方法二:本地安装(无需科学上网,不会科学上网的适用) 二、安装油猴插件 方法一&am…

用 19 个基本脉动调查问题追踪趋势

作为一个人力资源的领导者,你如何知道哪些调查结论需要优先处理? 答案是。你不应该优先考虑任何特定的调查结论。当你试图根据数字做出改变时,你要根据趋势采取行动。趋势是事物发展的方向。一个数据点只是一个固定在时间上的数字&#xff0…

Spring【Bean的作用域与生命周期】

Spring【Bean的作用域与生命周期】🍎一.Bean作用域问题🍒1.1 被修改的 Bean 案例🍒1.2 原因分析🍎二.作⽤域定义🍒2.1Bean 的 6 种作⽤域🍉 2.1.1singleton(单例作⽤域)🍉 2.1.2prototype(原型作…

cubeIDE开发,在LCD显示摄像头抓取的图片数据

一、摄像头相关资料信息 在LCD上显示当前camera的图像数据,类似我们前面提到的LCD显示图片数据,就是实时将摄像头抓取的视频数据帧(图片)转换成图片字码表,即LCD宽*LCD高像素大小的颜色点阵,然后推送到LCD接…

【✨十五天搞定电工基础】正弦交流电路的分析

本章要求 1. 理解正弦量的特征及其各种表示方法; 2. 理解电路基本定律的相量形式及阻抗;熟练掌握计算正弦交流电路的相量分析法, 会画相量图; 3. 掌握有功功率和功率因数的计算,了解瞬时功率、无功功率和视在功率的概…

Mysql SQL优化跟踪来看看是如何优化并决策使用哪个索引或者不适用索引

背景 使用索引字段进行筛选数据时,explain查询语句发现MySQL居然没有使用索引,产生疑问,因此决定调查清楚为什么会不用索引,而是走全表扫描 原因调查出的结果是当你要查询的数据量是连续又占整个表五分之一以上那就不会走索引了&a…

【git 介绍】AhuntSun

Git应用详解第一讲:Git分区,配置与日志 Git应用详解第二讲:Git删除、修改、撤销操作 Git应用详解第三讲:本地分支的重要操作 Git应用详解第四讲:版本回退的三种方式与stash Git应用详解第五讲:远程仓库…