【问题标题】:Understanding preemptive multitasking with locks and the Python GIL?了解使用锁和 Python GIL 的抢先式多任务处理?
【发布时间】:2017-12-12 09:53:14
【问题描述】:

我正在阅读Grok The GIL,它在关于锁定的讨论中有以下声明。

只要没有线程在休眠、执行 I/O 或其他一些 GIL 删除操作时持有锁,您就应该尽可能使用最粗糙、最简单的锁。无论如何,其他线程不可能并行运行。

它是在讨论抢先式多任务处理之后出现的。当你有锁时,是什么阻止了 GIL 的抢先丢弃?或者这不是这个声明所指的?

【问题讨论】:

    标签: python locking multitasking gil


    【解决方案1】:

    我问了这篇文章的作者,它归结为放弃 GIL 之间的区别,因为您正在等待外部操作与内部抢占:https://opensource.com/article/17/4/grok-gil#comment-136186

    嗨!没有什么可以阻止线程在 它有一把锁。让我们称之为线程 A,假设还有 线程 B。如果线程 A 持有锁并被抢占,那么可能 线程 B 可以代替线程 A 运行。

    如果线程 B 正在等待线程 A 持有的锁,那么线程 B 在等待 GIL。在这种情况下,线程 A 在删除 GIL 后立即重新获取它,然后线程 A 继续。

    如果线程 B 没有等待 线程 A 持有的锁,那么线程 B 可能会获取 GIL 并运行。

    然而,我关于粗锁的观点是:没有两个线程 由于 GIL,可以并行执行 Python。所以使用 细粒度锁不会提高吞吐量。这与 像 Java 或 C 这样的语言,其中细粒度的锁允许更大的 并行性,从而提高吞吐量。

    我仍然需要澄清,他确实证实了这一点:

    如果我对您的理解正确,我引用的语句的目的是避免在外部操作周围使用锁,如果它们都依赖于该锁,您可以在其中阻塞多个线程。

    对于抢占式示例,线程 A 没有被任何外部事物阻塞,因此处理只是像协作多任务处理一样来回进行。

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2014-04-25
      • 2011-07-21
      • 1970-01-01
      • 2018-04-04
      • 2014-01-11
      相关资源
      最近更新 更多