了解使用锁和Python GIL的抢占式多任务处理?

时间:2017-07-08 02:33:56

标签: python locking multitasking gil

我通过Grok The GIL阅读,并且在关于锁定的讨论中有以下陈述。

  

只要没有线程在休眠时持有锁,I / O或其他一些GIL丢弃操作,你应该使用最粗糙,最简单的锁。其他线程无论如何也无法并行运行。

在讨论抢先式多任务处理之后。是什么阻止了你在锁定时抢先发生GIL?或者这不是本声明所指的那个?

1 个答案:

答案 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不会被外部任何东西阻止,因此处理就像合作多任务处理一样来回。