发布GIL的成本是多少?

Jas*_*ker 8 python multithreading gil python-c-extension

假设我有一个C扩展函数,它可以完全独立于Python解释器.有没有理由释放GIL?

例如,有没有理由不写这样的代码(除了可读性和避免微优化之类的问题 - 重要但与我的问题无关的事情)?

Py_BEGIN_ALLOW_THREADS
    a = 1 + 1;
Py_END_ALLOW_THREADS
Run Code Online (Sandbox Code Playgroud)

显然,这是一个简单的代码,其中性能可能无关紧要.但有没有任何表现理由不在这里发布GIL?或者只应发布GIL以获得更多CPU密集型代码?

Die*_*Epp 7

GIL是一种普通的互斥体.锁定或解锁无争用互斥锁的成本非常低,不会超过更改全局变量的成本.但是,如果经常锁定和解锁有争议的互斥锁,则互斥锁的成本会变得很高.

所以,这通常不是一个好主意:

Py_BEGIN_ALLOW_THREADS
    a = 1 + 1;
Py_END_ALLOW_THREADS
Run Code Online (Sandbox Code Playgroud)

这里发生的事情是你正在解锁一个你试图在之后立即再次锁定的互斥锁.如果这是两个大块代码之间的中断,那么它为另一个线程提供了运行的机会.但是如果您没有线程粒度问题,请保持锁定.

所以在这种情况下这是一个好主意:

very_long_computation_requires_gil();
Py_BEGIN_ALLOW_THREADS;
a = a + i;
Py_END_ALLOW_THREADS;
very_long_computation_also_requires_gil();
Run Code Online (Sandbox Code Playgroud)

在不了解情境的情况下进行有根据的猜测真的是不可能的,如果没有运行测试,通常仍然很难.