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任然是一个好的设计虽然损失了性能,但在保证资源不会冲突和预防死锁方面有一定作用
以上就是python中gil全局解释器锁的实现方式及原理解析的详细内容。