我有一个非常具体的需求: 我想创建一个带有 Qt Widget 的 python 控制台,并且能够拥有多个独立的解释器。 现在让我尝试解释一下我的问题在哪里,以及我所做的所有尝试,按照我最希望在默认情况下使用的顺序排列
第一点是 Python C API 中的所有函数(PyRun[...]、PyEval[...] ...)都需要 GIL 锁定,这禁止来自 C 的任何并发代码解释(否则我真的很高兴我错了!!!:D)
因此,我尝试了“通常方式”之外的另一种方法:我在 python 中创建了一个循环,在我的特殊文件上调用 read() 并评估结果。此函数(作为内置扩展实现)会阻塞,直到有数据要读取。 (实际上,目前是 C 代码中的一段时间,而不是基于 pthread 的条件) 然后,使用 PyRun_simpleString(),我在另一个线程中启动循环。这就是问题所在:我的读取函数除了阻止当前线程(这是完全正常的)之外,它还阻止整个解释器,并且 PyRun_simpleString() 不返回...
最后,我想到了最后一个想法,该想法的风险相对较慢:在 C++ 中拥有一个专用线程来运行解释器,并在 python 中执行所有操作来管理输入/输出。这可能是一个循环,当控制台需要执行命令时,它会创建作业。似乎并不难做到,但我更喜欢问你:有没有一种方法可以使上述可能性发挥作用,或者是否有另一种我没有想到的方法,或者我最后一个想法是最好的?
最佳答案
一种替代方法是重复使用 IPython 及其 Qt Console 中的代码。 。这假设通过独立解释器你暗示他们不会共享内存。 IPython 在多个进程中运行 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 .
关于Python 和 C/C++ 多线程 : run several threads executing python in the background of C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22435352/