目标:
    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语言任务代码(多线程执行任务的代码)

    image.png


    第二步:在 unubtu 终端内将后缀为 c 的文件编译为后缀为 so 的文件

    指令关键字:gcc
    语法:gcc 后缀为c的文件名 -shared -o 待生成的后缀为so的文件名

    注意事项:
    1:待生成的后缀为so的文件名一般都是以lib三个字母开头
    2:需要进入c文件所在的文件夹内才能执行此命令
    3:-shares选项代表将目标文件编译为so文件
    4:-o选项是用来输入的文件名选项

    截图:

    image.png

    第三步:在python程序内导入 ctyes 库并导入 so 文件从而执行so文件内的多线程任务

    关键语法:
    import ctypes
    lib = ctypes.cdll.LoadLibrary(“./so文件名”)

    注意事项:
    1:导入so文件时,一定要在相对位置目录导入,并且要加上 ./

    代码演示:

    image.png


    第四步:执行代码查看cpu核的利用率判断是否解决了GIL

    image.png


    二:多线程的适用场景

    适用场景:I/O密集型可使用多线程(GIL锁会释放)
    不适用场景:CPU密集型不建议使用多线程(CPU利用率不高)