我通过Grok The GIL阅读,并且在关于锁定的讨论中有以下陈述。
只要没有线程在休眠时持有锁,I / O或其他一些GIL丢弃操作,你应该使用最粗糙,最简单的锁。其他线程无论如何也无法并行运行。
在讨论抢先式多任务处理之后。是什么阻止了你在锁定时抢先发生GIL?或者这不是本声明所指的那个?
答案 0 :(得分:1)
我问过这篇文章的作者,它归结为放弃GIL之间的区别,因为你正在等待外部操作与内部preemtion:https://opensource.com/article/17/4/grok-gil#comment-136186
嗨!什么都没有阻止线程抢先放弃GIL 它持有一把锁。让我们称之为线程A,并且让我们也说出来 一个线程B.如果线程A持有一个锁并被抢占,那么也许 线程B可以运行而不是线程A.
如果线程B正在等待线程A持有的锁定,则线程B 不等待GIL。在这种情况下,线程A在丢弃后立即重新获取GIL,并且线程A继续。
如果线程B没有等待 线程A持有的锁,然后线程B可能获取GIL 并运行。
然而,关于粗锁的观点是这样的:没有两个线程 因为GIL,可以并行执行Python。所以使用 细粒度锁不会提高吞吐量。这与之形成鲜明对比 像Java或C这样的语言,其中细粒度锁允许更大 并行性,因此吞吐量更大。
我仍需要一些澄清,他确实证实了这一点:
如果我正确地理解你,我引用的语句的目的是避免在外部操作中使用锁,然后你可以阻止多个线程,如果它们都依赖于那个锁。
对于抢先示例,线程A不会被外部任何东西阻止,因此处理就像合作多任务处理一样来回。