目标:
1:掌握python多线程解决GIL问题的几种方案
2:掌握多线程的适用场景
一:python多线程解决GIL问题的几种方案
方案一:因为GIL是 python 底层解释器 Cpython 产生的,因此可以更换其他底层解释器,例如 jpython 【不推荐】
不推荐原因:python默认解释器就是CPython,而不是Jpython,这肯定是有原因的
方案二:将多线程改成多进程【推荐】
优点:每一个进程都拥有一把GIL,不会因为互斥锁特性造成同一时间只有一个线程在执行任务,可以解决多线程利用 cpu 核不充分的问题
缺点:进程是资源分配的基本单元,改成多进程会消耗更多的内存资源,当计算机内存紧张是不推荐使用!
方案三:将多线程执行的任务(函数)改用 c语言代码编写,可避免GIL!
详解:python是胶水语言,将 c文件编译为so 文件,并在python内导入 ctypes 模块即可在python内执行 c文件代码!
实现步骤:
第一步:在pycharm内创建后缀为 c 的C语言文件 new → file →文件名.c 编写c语言任务代码(多线程执行任务的代码)
第二步:在 unubtu 终端内将后缀为 c 的文件编译为后缀为 so 的文件
指令关键字:gcc
语法:gcc 后缀为c的文件名 -shared -o 待生成的后缀为so的文件名
注意事项:
1:待生成的后缀为so的文件名一般都是以lib三个字母开头
2:需要进入c文件所在的文件夹内才能执行此命令
3:-shares选项代表将目标文件编译为so文件
4:-o选项是用来输入的文件名选项
截图:
第三步:在python程序内导入 ctyes 库并导入 so 文件从而执行so文件内的多线程任务
关键语法:
import ctypes
lib = ctypes.cdll.LoadLibrary(“./so文件名”)
注意事项:
1:导入so文件时,一定要在相对位置目录导入,并且要加上 ./
代码演示:
第四步:执行代码查看cpu核的利用率判断是否解决了GIL
二:多线程的适用场景
适用场景:I/O密集型可使用多线程(GIL锁会释放)
不适用场景:CPU密集型不建议使用多线程(CPU利用率不高)