开发者

Python中GIL全局解释锁的实现

目录
  • 1.为什么有GIL
  • 2.GIL 是如何工作的
  • 3.python的线程安全
  • 4.如何如何绕过 GIL?
  • 5.在处理cpu密集型任务时,为什么有时候使用多线程会比单线程还要慢些?
  • 6 .你觉得 GIL 是一个好的设计吗?

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

1.为什么有GIL

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

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

2.开发者_JAVA学习GIL 是如何工作的

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

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

for (;;) {
    if (--ticker < 0) {
        ticker = check_interval;
python    
        /* Give anotphpher thread a chance */
        PyThread_release_lock(interpreter_lock);
    
        /* Other threads may run now */
    
        PyThread_acquire_lock(interpreter_lock, 1);
    }
cCByg 
    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任然是一个好的设计虽然损失了性能,但在保证资源不会冲突和预防死锁方面有一定作用

到此这篇关于Python中GIL全局解释锁的实现的文章就介绍到这了,更多相关Python GIL全局解释锁内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新开发

开发排行榜