https://www.bilibili.com/video/BV1bK411A7tV?from=search&seid=14072974049100810108
单线程串行VS多线程并发VS多CPU并行VS多机器并行
使用lock对资源枷锁,防止冲突访问。
并发和并行
1、并发:英文是concurrency
指同一时刻只能有一条命令执行,但是多个线程的对应的指令被快速轮换的执行。
一个处理器,先执行线程A一段时间,再执行线程B的指令一段时间,再切换回到线程A执行一段时间。
由于处理器执行指令的速度和切换的速度非常快,人完全感知不到计算机再这个过程中有多少个线程切换上下文执行的操作,使得宏观上看起来多个线程在同时运行,但微观上只是这个处理器在连续不断地在多个线程之间切换和执行。
2、并行:英文名是parallel
指同一时刻有多条指定在多个处理器上同时执行,并行必须要依赖于多个处理器,不论是宏观还是围观,多个线程都是在同一时刻一起执行的。
并行只能在多处理器系统中存在,如果计算机处理器只有一个核,那就不能实现。
例子:
如果系统处理器只有一个核,那它只能通过并发的方式运行这些线程,如果系统处理器有多个核,则一个核在执行一个线程时,另一个核可以执行另一个线程,这样两个线程就实现了并行执行。
多线程、多进程、多协程的选择
1、CPU密集型计算、IO密集型计算
CPU密集型:计算密集型,IO在短时间内可以完成,CPU需要大量的计算和处理
IO密集型:系统运作大部分的状况是CPU等IO的读写操作
2、多线程、多进程、多协程的对比
一个进程中可以启动N个线程
一个线程中可以启动N个协程
多进程:优点:可以利用多核CPU并行运算
缺点:占用资源最多,可以启动数目比线程少
适用于:CPU密集型计算
多线程:优点:相比进程,更轻量级,占用资源少
缺点:相比进程多线程只能并发执行,不能利用多CPU;相比协程启动数目有限,占用内存资源有线程切换开销。
适用于IO密集型计算,同时运行的任务数目要求不多
多协程:优点:内存开销最小,启动协程数量最多。
缺点:支持的库有限制,代码实现复杂。
适用于IO密集型计算、需要超多任务运行,但有现成库支持的场景。
3、怎么根据任务选择对应技术
python速度慢的原因:
原因:动态类型语言,边解释边执行;GIL(Global Interpreter Lock,全局解释器锁)的存在
GIL:是计算机程序设计语言解释器用于同步线程的一种机制,使得任何时刻仅有一个线程在执行,即使在多核处理器上,使用GIL的解释器也只允许同一时间执行一个线程。
GIL的好处:简化了python对共享资源的管理。
如何规避GIL的限制:
1、多线程threading机制用于IO密集型计算,因为在IO期间,线程会释放GIL,实现CPU和IO的并行。故多线程用于IO密集型计算依然可以大幅提升速度。但是多线程用于CPU密集型计算时,会拖慢速度。
2、使用multiprocessing的多进程机制实现并行计算、利用多核CPU优势为了应对CIL的问题,python提供了multiprocessing。
https://baijiahao.baidu.com/s?id=1666454968534966585&wfr=spider&for=pc
调用进程
from time import sleep
def worker(interval):
print("work start")
sleep(interval)
print("work end")
print("主进程正在执行")
p=Process(target=worker,args=(3,))
#调用子进程
p.start()
print("主进程执行完成")
结果:结束语句在子进程执行之前执行。
期望:输出语句在子进程执行完成后输出。