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

了解带锁的抢占式多任务处理和Python GIL?,python,locking,multitasking,gil,Python,Locking,Multitasking,Gil,我正在通读,它在关于锁定的讨论中有以下陈述 只要没有线程在休眠、I/O或其他GIL丢弃操作时持有锁,就应该使用最粗糙、最简单的锁。其他线程无论如何也不能并行运行 它是在一次关于先发制人多任务处理的讨论之后出现的。当您拥有锁时,什么可以防止GIL的先发制人下降?或者这不是这句话所指的吗?我问了这篇文章的作者,它归结为因为等待外部操作而放弃GIL与内部抢占之间的区别: 嗨!没有任何东西可以阻止线程在运行时先发制人地丢弃GIL 它有一把锁。让我们称之为线程A,假设还有 如果线程a持有锁并被抢占,那么可

我正在通读,它在关于锁定的讨论中有以下陈述

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


它是在一次关于先发制人多任务处理的讨论之后出现的。当您拥有锁时,什么可以防止GIL的先发制人下降?或者这不是这句话所指的吗?

我问了这篇文章的作者,它归结为因为等待外部操作而放弃GIL与内部抢占之间的区别:

嗨!没有任何东西可以阻止线程在运行时先发制人地丢弃GIL 它有一把锁。让我们称之为线程A,假设还有 如果线程a持有锁并被抢占,那么可能 线程B可以代替线程A运行

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

如果线程B没有等待 线程A持有的锁,那么线程B可能获得GIL 然后跑

然而,我关于粗锁的观点是:没有两条线 可以并行执行Python,因为GIL。所以使用 细粒度锁不能提高吞吐量。这与 一种类似Java或C的语言,其中细粒度锁允许更大的 并行性,从而提高吞吐量

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

如果我理解正确的话,我引用的语句的目的是避免在外部操作中使用锁,如果多个线程都依赖于该锁,那么就可以阻塞多个线程

对于抢占式示例,线程A没有被外部任何东西阻塞,因此处理只是来回地进行,类似于协作多任务处理