并发、并行、异步、同步(暂存)
# 1. 并发 VS. 并行(parallelism)
并发单纯代表计算机能同时执行多项任务,具体怎么实现的会有多种形式。
- 单核:分配时间片,进程或线程进行上下文切换,实现并发。
- 多核:多核处理器上,可以在不同的核心上真正并行地执行任务。
# 2. 同步 VS. 异步
同步:必须等前一个任务完毕之后才能开始下一个任务,没有并发、并行的概念。
异步:不同任务之间不互相等待,直到任务完成之后才回来通知你。
典型实现方式:多线程。
- 若在多核心上运行,则不同线程分配到不同的核心上运行。
- 若在单核心上运行,或通过设置亲和力(Affinity)强制将线程绑定到某个核心上,则会通过分配时间片的方式进行并发地执行各个线程。
python 的 asyncio 就是原生的异步编程方式,
# 2.1 多线程编程(Multi-threading) VS. (单线程)异步编程(Asynchronous Programming)
- 多线程编程:适合计算量密集的应用。视频、图像处理、科学计算等,不让 CPU 核心消耗在无畏的等待上。
异步编程:I/O密集型程序应用异步编程。
用多线程编程容易造成资源浪费,各个线程都会处于等待 I/O 操作的过程中,线程自身会占用额外内存,并且线程之间的切换会有额外的开销,以及线程之间的资源竞争问题。
# 2.2 异步编程
不同任务之间不互相等待,直到任务完成之后才回来通知你,通常以回调函数(callback)的方式来通知你。这种编程模式避免了程序的阻塞,提高了 CPU 执行效率。尤其适用 I/O 密集、操作数据库、访问文件等操作。
Promise (承诺) : 寓意这个去这个请求会在未来某一个时刻返回
解决了回调地狱的问题
例如: fetch 向服务器请求,返回Promise对象,渲染前端,如果可以使用 then 进行接受返回的结果
fetch("https://www.woshishuaige.om").then((res)=>{
})
1
2
3
2
3
async / await
用 async 标记一个函数为异步函数,在这样的函数中,可以用 await 来调用其他的异步函数,这样避免了用 Promise , 以及一系列的 then 等等。
不能在全局和普通函数中使用 await 关键字,只能被应用异步,所以想要使用 await 就必须用 async 修饰函数。
编辑 (opens new window)
上次更新: 2023/05/17, 13:14:17