GIL锁

知识点

Python GIL的概念

  1. GIL:全局解释器,同一个进程中的每个线程在执行的过程都需要现获取GIL,保证在同一个时刻只有一个线程可以执行代码。
  2. python程序与GIL本身无关,仅仅是因为历史原因构建了cpython解释器导致,如果要在cpython中移除GIL,会很难。

GIL对Python的影响

  1. 线程释放GIL锁的情况:在IO操作等可能会引起阻塞的system call之前可以暂时释放GIL,但在执行完毕后,必须重新获取GIL python3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或者python2.x tickets计数达到100。
  2. 在利用cpython解释器时,使用多进程是可以利用多核的cpu资源的。或者利用其它python解释器就没有这个问题,或者可以利用第三方语言(如c)来实现多线程就可以解决该问题。
  3. 多线程运行时是会比单线程性能有所提升的,因为遇到IO阻塞时会自动释放GIL锁。

补充知识

  • c语言在linux中的编译

    1
    2
    3
    4
    # 将.c文件编译为可执行文件
    gcc xxx.c
    # 将.c文件编译为动态库文件(可被其它程序调用)
    gcc xxx.c -shared -o libxxx.so
  • 在python中调用c语言程序的动态库

    1
    2
    3
    4
    5
    6
    # 导入模块
    from ctypes import *
    # 加载动态库
    lib = cdll.LoadLibrary("./libxxx.so")
    # 调用动态库中的函数信息
    lib.Deadloop()

作业

  1. (问答)描述Python GIL的概念
  2. (问答)GIL对python的影响
  3. 现有已经写好的c语言文件:xxx.c,如何将其编译为可执行文件
  4. 现有已经写好的c语言文件:xxx.c,如何将其编译为动态库文件
  5. 在python程序中如何调用c语言动态库文件xxx.so中的方法test