协程和异步编程
-
解释器(读取源代码,生成指令让计算机硬件执行)
(1)CPython:原生,C语言实现的Python,解释器以C语言开发
(2)IPython:基于CPython,交互上增强。
(3)PyPy:PyPy采用JIT(即时编译),对Python代码进行动态编译
(2)Jpython:运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行
-
GIL
定义:(CPython特有)全局解释锁,控制任何时刻只有一个线程在运行。
目的:防止两个线程同时操作一个对象
限制:多核处理器可能出现线程频繁切换,但只有一个线程真正执行
导致:python只能实现并发(某一时刻,只有一个任务在处理器执行);不能实现并行(同时运行)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SaZ5biE1-1615364584272)(file:///C:/Users/hujiayan/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png)]
-
多线程 threading
运行在一个进程里,为保障安全需要加锁,cpu抢占式调度
-
协程
在一个线程里实现任务的切换和交叉运行,通过yield(产出/让步)和send(传递参数到协程对象内)来进行人为控制实现调度
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iF8l0yZT-1615364584274)(file:///C:/Users/hujiayan/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png)]
-
异步编程
采用了IO复用的方法实现非阻塞的操作,通过注册读事件或写事件,当事件发生触发回调,让程序继续执行后面逻辑(协程+asyncio)
总结
由于在Python中有GIL的存在,实际只能有一个线程运行,使用多线程的效果可能不一定比单线程更佳。但是可通过协程,即异步编程方式,在线程内部实现更高效快速的切换和调度,增加程序运行速度。另外,GIL只存在于一个Python进程内,Python进程间是不共用的,因此使用多进程+协程的代码实现,有利于充分利用处理器资源,提升应用性能。