并发与并行的区别

并发

并发:每个时间段只允许处理一个进程
多个进程看似在同步运行,但并非正正的在同一时刻同时运行
例如:一个人一边在煮菜,一边在看书,他不可能在煮菜时同时看书,
只能先把菜放入锅里煮时,抽空走出厨房,回到房里看书,当菜煮好了,
又要放下书,回去把菜翻炒翻炒。炒菜和看书看似同时进行,但实际上,
炒菜和看书,一个时间段只能处理其一。

并行

并行:多个进程在同一时刻同时运行
例如:类似有多核CPU处理程序,还是炒菜和看书的例子,
就就好像有两个人在处理,一个人在炒菜,同时,另一个人在看书,
这两件事是同一时刻同时进行的。

Python中如何实现并发进程???
利用 多进程、多线程、异步编程即可

Multiple Processes
抢占式多任务,操作系统调度,可使用多核CPU

Multiple Threads
抢占式多任务,操作系统调度,不能使用多核CPU

Asynchronous Programming
协作式多任务,单进程、单线程

同步与异步

先看同步对弈和异步对弈

前提条件:假设A要与B1 ~ B12 对弈,A思考需要5s,B1 ~ B12 中,每个人要思考55s,对局需要30个回合才能分输赢,下棋时常忽略不计。

同步对弈 Synchronous
同步对弈指:A与B1对弈完成后,才开始与B2对弈,以此类推,所以A走完30个回合的总时间是(5+55)*30*12=21600s

异步对弈 Asychronous
异步对弈指:A与B1对弈时,A先下花了5s与B1下第一回合,B1需要花55s的时间思考,A不等待B1,直接与B2对弈,一直到与B12对弈了后,才返回跟B1对弈。而这时,A走完每个棋局的第一步需要花费12*5=60s,60s过去B1已经走完第一步,A与B1进行第二回合的对弈。A走完30个回合的总时间是60*30=1800s

21600/1800 = 12,异步对弈效率提高了12倍

异步编程:

指在 单线程 中 并发 执行多个任务,当一个任务在等待数据时,它会释放 CPU 资源,

转而执行其它任务,通过程序员自己主动切换任务来最小化空闲时间。
异步实现:异步函数在等待数据时被暂停执行,当数据到达时,又能够在被暂停的位置处恢复执行。

异步 I/O 操作

指当你发起一个 I/O 操作(比如,等待网络图片数据的到来),却不用等它结束,
你可以继续去做其它的事情,当它结束时,你会得到通知,然后再回来接着处理这个 I/O 后续的操作。
而 同步 I/O 操作 则会被阻塞在 I/O 操作上直到它完成,这期间 CPU 做了很多事,只是没有运行你的程序。