并发编程(三)
1、多线程
1.1、GIL(Global Interpreter Lock)全局解释器锁
其他语言,CPU是多核时,是支持多个线程同时执行,但在python中,无论是单核还是多核,在任意时刻只能有一个线程在执行。其根源是GIL的存在。
GIL:来源是python设计之初,为了数据安全所做的决定。某个线程想要执行,必须先拿到GIL看作是“通行证”,并且在一个python进程中,GIL中只有一个,拿不到GIL的线程,无法进入CPU执行
1.2、目前的python解释器:
(1)、CPython:CPython是用C语言实现的Python解释器。 作为官方实现,它是最广泛使用的Python解释器。
(2)、PyPy:PyPy是用RPython实现的解释器。RPython是Python的子集, 具有静态类型。这个解释器的特点是即时编译,支持多重后端(C, CLI, JVM)。PyPy旨在提高性能,同时保持最大兼容性(参考CPython的实现)。
(3)、Jython:Jython是一个将Python代码编译成Java字节码的实现,运行在JVM (Java Virtual Machine) 上。另外,它可以像是用Python模块一样,导入并使用任何Java类。
(4)、IronPython:IronPython是一个针对 .NET 框架的Python实现。它可以用Python和 .NET framework的库,也能将Python代码暴露给 .NET框架中的其他语言。
GIL只在CPython中才有,而在PyPy和Jython中是没有GIL的。
由于GIL锁存在,Python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,Python 的多线程效率并不高的根本原因
2、多进程
Python要进行多进程操作,需要用到muiltprocessing
库,其中的Process
类跟threading
模块的Thread
类很相似。
3、多线程和多进程的应用场景
要看程序属于哪种类型,一般分为:CPU密集型、I/O密集型
3.1、CPU密集型:程序比较偏重于计算,需要经常使用CPU来运算。例如科学计算的程序,机器学习的程序等。
3.2、I/O密集型:顾名思义就是程序需要频繁进行输入输出操作。爬虫程序就是典型的I/O密集型程序。
如果程序是属于CPU密集型,建议使用多进程; 而多线程就更适合应用于I/O密集型程序。