Python& C / C ++多线程:在C的后台运行几个执行python的线程

时间:2014-03-16 09:50:08

标签: python c multithreading gil

我有一个非常具体的需求: 我想用Qt Widget创建一个python控制台,并且能够拥有几个独立的解释器。 现在,让我试着解释一下我的问题和我所做的所有尝试,按照我最想做的那些,我可以默认使用的那些

  • 第一点是Python C API中的所有函数(PyRun [...],PyEval [...] ...)需要锁定GIL,禁止任何来自C的并发代码解释(或者我真的很高兴错了!!!:D)

  • 因此,我尝试了另一种方法,而不是“通常的方式”:我在python中创建了一个循环,在我的特殊文件上调用read()并评估结果。此函数(作为构建的扩展实现)会阻塞,直到有数据要读取。 (实际上,它目前在C代码中有一段时间而不是基于pthread的条件) 然后,使用PyRun_simpleString(),我在另一个线程中启动我的循环。这就是问题所在:我的读取函数,除了阻塞当前线程(这是完全正常的),它阻塞整个解释器,PyRun_simpleString()不返回...

  • 最后,我最后想到哪个风险相对较慢:在C ++中有一个运行解释器的专用线程,并在python中做所有事情来管理输入/输出。这可能是一个循环,当控制台需要执行命令时会创建作业。似乎不是很难做到,但我更愿意问你:有没有办法让上述可能性发挥作用,还是有其他方式我没有想到或者我的最后一个想法是最好的?

2 个答案:

答案 0 :(得分:3)

另一种方法是重新使用来自IPython及其Qt Console的代码。这假设由独立解释器暗示他们不会共享内存。 IPythons在多个进程中运行Python解释器,并在ZeroMQ的帮助下通过TCP或Unix域套接字与它们进行通信。

此外,根据您的问题,我不确定您是否了解Python C扩展中常见的阻塞I / O习惯用法:

Py_BEGIN_ALLOW_THREADS
... Do some blocking I/O operation ...
Py_END_ALLOW_THREADS

这将释放GIL,以便其他线程可以在您的函数阻塞时执行Python代码。请参阅Python/C API Reference Manual: Thread State and the Global Interpreter Lock

答案 1 :(得分:0)

如果你的主要要求是让几个解释器独立,你可能更适合做fork()和exec()而不是多线程。

这样每个口译员都会住在自己的地址空间而不会打扰其中一个口译员。