1 并发
2 并行
3 同步
4 异步
5 阻塞
6 非阻塞
6.1 同步阻塞,异步阻塞,同步非阻塞,异步非阻塞
7 异步编程
1 并发
1 并发描述的是程序的组织结构。指程序要被设计成多个可独立执行的子任务。
2 以利用有限的计算机资源使多个任务可以被实时或近实时执行为目的。
3 所谓并发,就是通过一种算法将 CPU 资源合理地分配给多个任务,当一个任务执行 I/O 操作时,
CPU 可以转而执行其它的任务,等到 I/O 操作完成以后,或者新的任务遇到 I/O 操作时,
CPU 再回到原来的任务继续执行。
4 虽然 CPU 在同一时刻只能执行一个任务,但是通过将 CPU 的使用权在恰当的时机分配给不同的任务,
使得多个任务在视觉上看起来是一起执行的。CPU 的执行速度极快,多任务切换的时间也极短,
用户根本感受不到,所以并发执行看起来才跟真的一样
2 并行
1 并行描述的是程序的执行状态。指多个任务同时被执行。
2 以利用富余计算资源(多核CPU)加速完成多个任务为目的。
3 多核 CPU 的每个核心都可以独立地执行一个任务,而且多个核心之间不会相互干扰。
在不同核心上执行的多个任务,是真正地同时运行,这种状态就叫做并行
'''
并行是指两个或者多个事件在同一时刻发生
并发是指两个或多个事件在同一时间间隔发生
并发针对单核 CPU 而言,它指的是 CPU 交替执行不同任务的能力;
并行针对多核 CPU 而言,它指的是多个核心同时执行多个任务的能力。
单核 CPU 只能并发,无法并行;换句话说,并行只可能发生在多核 CPU 中。
在多核 CPU 中,并发和并行一般都会同时存在,它们都是提高 CPU 处理任务能力的重要手段
'''
3 同步
1 不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以'协调一致',称这些程序单元是同步执行的。
2 例如购物系统中更新商品库存,需要用“锁”作为通信信号,让不同的更新请求强制排队顺序执行,那更新库存的操作是同步的。
3 同步是一件事一件事的做;只有执行完前一个任务,才会执行下一个任务。简言之,'同步意味着有序'。
4 异步
1 为完成某个任务,不同程序单元之间'过程中无需通信协调',也能完成任务的方式。
2 不相关的程序单元之间可以是异步的。
3 例如,爬虫下载网页。调度程序调用下载程序后,即可调度其他任务,
而无需与该下载任务保持通信以协调行为。不同网页的下载、保存等操作都是无关的,也无需相互通知协调。
这些异步操作的完成时刻并不确定。
4 当一个任务已经执行了,你无需等待该任务执行完成,就可以切换到另外一个任务上。简言之,'异步意味着无序'。
上文提到的"通信方式"通常是指异步和并发编程提供的同步原语,如信号量、锁、同步队列等等。
我们需知道,虽然这些通信方式是为了让多个程序在一定条件下同步执行,但正因为是异步的存在,
才需要这些通信方式。如果所有程序都是按序执行,其本身就是同步的,又何需这些同步信号呢?
5 阻塞
1 程序未得到所需计算资源时被挂起的状态。
2 '程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。'
3 常见的阻塞形式有:网络I/O阻塞、磁盘I/O阻塞、用户输入阻塞等。
阻塞是无处不在的,包括CPU切换上下文时,所有的进程都无法真正干事情,它们也会被阻塞。
(如果是多核CPU则正在执行上下文切换操作的核不可被利用。)
6 非阻塞
1 '程序在等待某操作过程中,自身不被阻塞,可以继续运行干别的事情,则称该程序在该操作上是非阻塞的。'
2 非阻塞并不是在任何程序级别、任何情况下都可以存在的。
3 仅当程序封装的级别可以囊括独立的子程序单元时,它才可能存在非阻塞状态。
非阻塞的存在是因为阻塞存在,正因为某个操作阻塞导致的耗时与效率低下,我们才要把它变成非阻塞的。
要支持并发,必须拆分为多任务,不同任务相对而言才有阻塞/非阻塞、同步/异步。
所以,并发、异步、非阻塞三个词总是如影随形。
6.1 同步阻塞,异步阻塞,同步非阻塞,异步非阻塞
这些术语描述了不同的I/O模型,涉及到应用程序在进行输入和输出操作时与系统内核之间的交互方式。
以下是这些术语的解释:
1. **同步阻塞(Synchronous Blocking):**
- 在同步阻塞模型中,应用程序发起一个I/O操作,然后等待直到该操作完成。
在这个等待过程中,应用程序被阻塞,无法执行其他任务。
2. **异步阻塞(Asynchronous Blocking):**
- 在异步阻塞模型中,应用程序发起一个I/O操作,然后立即可以执行其他任务。
系统会在I/O操作完成时通知应用程序,这时应用程序需要阻塞等待通知,然后再处理I/O的结果。
3. **同步非阻塞(Synchronous Non-blocking):**
- 在同步非阻塞模型中,应用程序发起一个I/O操作,然后立即返回控制权,而不是等待操作完成。
应用程序需要定期检查操作是否完成,如果完成了就处理结果,否则可以继续执行其他任务。
4. **异步非阻塞(Asynchronous Non-blocking):**
- 在异步非阻塞模型中,应用程序发起一个I/O操作,并注册一个回调函数或通过事件通知的方式来处理
操作完成的事件。应用程序可以继续执行其他任务,而不需要定期检查操作状态。
一旦I/O操作完成,系统会调用注册的回调函数或触发事件通知,通知应用程序处理结果。
总体来说,同步和异步关注的是消息通信机制,而阻塞和非阻塞关注的是程序在等待调用结果(消息、返回值)
时的状态。同步通常意味着等待调用完成,而异步通常意味着不等待调用完成。阻塞通常意味着调用会一直
等待,而非阻塞通常意味着调用不会一直等待,而是立即返回。
7 异步编程
'''
以进程、线程、协程、函数/方法作为执行任务程序的基本单位,结合回调、事件循环、信号量等机制,
以提高程序整体执行效率和并发能力的编程方式。
'''
如果在某程序的运行时,能根据已经执行的指令准确判断它接下来要进行哪个具体操作,
那它是同步程序,反之则为异步程序。(无序与有序的区别)
同步/异步、阻塞/非阻塞并非水火不容,要看讨论的程序所处的封装级别。
例如购物程序在处理多个用户的浏览请求可以是异步的,而更新库存时必须是同步的。
1 并发 并行
并发:同一时间段内,执行多个任务的能力,所有操作系统都支持并发,单核cpu也可以并发
并行:同一时刻,执行多个任务的能力,并行必须是多cpu支持
python 开启多线程,即便有多核cpu,它也只能并发,无法并行---》原因是有gil锁
python 开启多进程+多核cpu,才能并行
io密集型使用多线程(io不消耗cpu),计算密集型使用多进程---》原因是什么
2 同步 异步
程序调用的角度
同步:同步是一件事一件事的做;只有执行完前一个任务,才会执行下一个任务。同步意味着有序
异步:当一个任务已经(开始)执行了,你无需等待该任务执行完成,就可以切换到另外一个任务上。异步意味着无序
# 我们用过的异步:
-借助于其他框架:scrapy,celery
-fastapi:异步web框架
-sanic:异步web框架
3 阻塞 非阻塞
程序执行的角度
阻塞:程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的
非阻塞:程序在等待某操作过程中,自身不被阻塞,可以继续运行干别的事情,则称该程序在该操作上是非阻塞的
我 找一个同学去给我接水
我是调用者----》我跟他说,去给我接水---》我一直啥事没干,在等他---》直到他回来,我就一直在等---》同步调用
我是调用者---》我跟他说,去给我接水---》我又在敲代码---》直到他回来,我在讲课,再跟它说话---》异步调用
从执行角度---》同学去跑去接水----》他一直在等水接完---》关掉饮水机---》拿着水回来了---》阻塞
从执行角度---》同学跑去接水---》接水过程中,它在聊天--》等水接完,关掉饮水机--》把水拿回来--》非阻塞
一定是有io操作,才涉及到阻塞非阻塞
同步阻塞
同步非阻塞
异步阻塞
异步非阻塞