> 文章列表 > Python的GIL全局解释锁

Python的GIL全局解释锁

Python的GIL全局解释锁

文章目录

      • 1.为什么有GIL
      • 2.GIL 是如何工作的
      • 3.python的线程安全
      • 4.如何如何绕过 GIL?
      • 5.在处理cpu密集型任务时,为什么有时候使用多线程会比单线程还要慢些?
      • 6 .你觉得 GIL 是一个好的设计吗?事实上,在 Python 3 之后,确实有很多关于 GIL 改进甚至是取消的讨论,你的看法是什么呢?你在平常工作中有被 GIL 困扰过的场景吗?

GIL(Global Interpreter Lock,即全局解释器锁)

1.为什么有GIL

  • 设计者为了规避类似于内存管理这样的复杂的竞争风险问题(race condition)

  • 因为 CPython 大量使用 C 语言库,但大部分C语言库都不是原生线程安全的(线程安全会降低性能和增加复杂度)

2.GIL 是如何工作的

  • 多个线程执行时,每一个线程在开始执行时,都会锁住 GIL,以阻止别的线程执行,同样的,每一个线程执行完一段后,会释放 GIL,以允许别的线程开始利用资源

  • CPython 中还有另一个机制,叫做 check_interval, CPython 解释器会去轮询检查线程 GIL 的锁住情况.每隔一段时间,Python 解释器就会强制当前线程去释放 GIL,这样别的线程才能有执行的机会

for (;;) {if (--ticker < 0) {ticker = check_interval;/* Give another thread a chance */PyThread_release_lock(interpreter_lock);/* Other threads may run now */PyThread_acquire_lock(interpreter_lock, 1);}bytecode = *next_instr++;switch (bytecode) {/* execute the next instruction ... */ }
}

3.python的线程安全

  • 有了GIL,任然在编程时需要考虑线程安全

4.如何如何绕过 GIL?

  • 绕过 CPython,使用 JPython(Java 实现的Python解释器)等别的实现
  • 把关键性能代码,放到别的语言(一般是 C++)中实现

5.在处理cpu密集型任务时,为什么有时候使用多线程会比单线程还要慢些?

GIL采用轮流运行线程的机制,GIL需要在线程之间不断轮流进行切换,线程如果多或者运行时间较长,切换带来的性能损失可能超过单线程

6 .你觉得 GIL 是一个好的设计吗?事实上,在 Python 3 之后,确实有很多关于 GIL 改进甚至是取消的讨论,你的看法是什么呢?你在平常工作中有被 GIL 困扰过的场景吗?

GIL任然是一个好的设计虽然损失了性能,但在保证资源不会冲突和预防死锁方面有一定作用