【发布时间】:2017-12-12 09:53:14
【问题描述】:
我正在阅读Grok The GIL,它在关于锁定的讨论中有以下声明。
只要没有线程在休眠、执行 I/O 或其他一些 GIL 删除操作时持有锁,您就应该尽可能使用最粗糙、最简单的锁。无论如何,其他线程不可能并行运行。
它是在讨论抢先式多任务处理之后出现的。当你有锁时,是什么阻止了 GIL 的抢先丢弃?或者这不是这个声明所指的?
【问题讨论】:
标签: python locking multitasking gil
我正在阅读Grok The GIL,它在关于锁定的讨论中有以下声明。
只要没有线程在休眠、执行 I/O 或其他一些 GIL 删除操作时持有锁,您就应该尽可能使用最粗糙、最简单的锁。无论如何,其他线程不可能并行运行。
它是在讨论抢先式多任务处理之后出现的。当你有锁时,是什么阻止了 GIL 的抢先丢弃?或者这不是这个声明所指的?
【问题讨论】:
标签: python locking multitasking gil
我问了这篇文章的作者,它归结为放弃 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 没有被任何外部事物阻塞,因此处理只是像协作多任务处理一样来回进行。
【讨论】: