<p>@Natecat的回答基本上是对的,如果在细节和细微差别上有点欠缺的话。<a href="https://docs.python.org/3/c-api/init.html" rel="nofollow">The docs of Python's C API</a>给出一个更完整的图片。假设这是您正在使用的Python实现,您需要注意以下几点:</p>
<blockquote>
<p>The Python interpreter is not fully thread-safe. In order to support multi-threaded Python programs, there’s a global lock, called the global interpreter lock or GIL, that must be held by the current thread before it can safely access Python objects. Without the lock, even the simplest operations could cause problems in a multi-threaded program [...].</p>
<p>Therefore, the rule exists that only the thread that has acquired the GIL may operate on Python objects or call Python/C API functions. In order to emulate concurrency of execution, the interpreter regularly tries to switch threads (see sys.setswitchinterval()). The lock is also released around potentially blocking I/O operations like reading or writing a file, so that other Python threads can run in the meantime.</p>
</blockquote>
<p>以及</p>
<blockquote>
<p>when threads are created from C (for example by a third-party library with its own thread management), they don’t hold the GIL, nor is there a thread state structure for them.</p>
</blockquote>
<p>注意:OpenMP就是这样。在</p>
<blockquote>
<p>If you need to call Python code from these threads [...] you must first register these threads with the interpreter by creating a thread state data structure, then acquiring the GIL, and finally storing their thread state pointer, before you can start using the Python/C API. When you are done, you should reset the thread state pointer, release the GIL, and finally free the thread state data structure.</p>
<p>The PyGILState_Ensure() and PyGILState_Release() functions do all of the above automatically. The typical idiom for calling into Python from a C thread is:</p>
<pre><code>PyGILState_STATE gstate;
gstate = PyGILState_Ensure();
/* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */
/* Release the thread. No Python API allowed beyond this point. */
PyGILState_Release(gstate);
</code></pre>
</blockquote>
<p>为了允许多个OpenMP线程安全地对同一个CPython解释器进行并发调用,您必须实现该模式,但是您不太可能从并行化中获得太多好处,因为各种OpenMP线程将在很大程度上被阻止并发运行。在</p>