2017-07-08 79 views
1

我读通过Grok The GIL,它有大约锁定在讨论下面的语句。了解抢占式多任务与锁和Python的GIL?

只要当它睡觉没有线程持有锁,并I/O,或其他一些GIL-下垂动作,你应该使用最粗,最简单的锁定成为可能。无论如何,其他线程无法并行运行。

它刚刚讨论了抢先式多任务处理。什么能防止在你锁定时发生GIL的抢先丢弃?或者这不是这个陈述所指的?

回答

0

我问片的作者,它丢弃GIL,因为你是进行外部操作,等待VS内部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是不会被任何外部的,所以处理只是去来回类似的合作多任务处理。