7

I have heard of Python's GIL problem, which states that there can only be one Python thread executing the Python bytecode at one time in a multicore machine. So a multithreaded Python program is not a good idea.

I am wondering if I can write a C extension that uses pthread to potentially boost the performance of my program. I'd like to create a thread in my C extension and make it runs in parallel with Python's main thread.

My assumption is that the Python main thread will do things more related to IO, while the pthread in my C extension will spend most of its time doing computation. The Python main thread communicates with the thread in the C extension using a queue (like a producer consumer model).

Is there any difference between multithread with Python and C extension?

4

3 回答 3

2

要回答您的原始问题:

是的,C 扩展可以不受 GIL 的影响,前提是它们不会在没有 GIL 的情况下调用任何 Python API 函数。因此,如果您需要与 Python 应用程序通信,则需要获得 GIL 才能这样做。如果您不想让 C API 太脏,您可以使用ctypes调用 C 库(可以pthreads照常使用),或 Cython 以类似 Python 的语法编写您的 C 扩展。

于 2012-09-28T08:22:06.440 回答
1

Python 解释器不会以任何方式知道 C 启动的线程,因此它们可以愉快地搅动自己的 CPU 时间。

但是我怀疑这是解决您的性能问题的正确解决方案。首先尝试将多进程与多进程模块一起使用。如果在此之后进程间 IO 过多,您可能会导致像 C 线程这样的诡计。这将使您的程序复杂一个数量级,因此请尽可能避免使用它。

于 2012-09-28T08:19:31.093 回答
0

如果一个线程运行 CPU 绑定,而另一个运行 IO 绑定,我看不出有问题。

IO 绑定线程将调用 IO 例程,这些例程通常在执行其工作时释放 GIL,从而有效地允许其他线程运行。

因此,请尝试“简单”解决方案,仅当它确实无法按照您想要的方式工作时才进行切换。

于 2012-09-28T08:34:24.353 回答