Python 和 C/C++ 多线程 : run several threads executing python in the background of C

标签 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 中执行所有操作来管理输入/输出。这可能是一个循环,当控制台需要执行命令时,它会创建作业。似乎并不难做到,但我更喜欢问你:有没有一种方法可以使上述可能性发挥作用,或者是否有另一种我没有想到的方法,或者我最后一个想法是最好的?

最佳答案

一种替代方法是重复使用 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/

相关文章:

python - 如何将 jenkins 作业配置 config.xml 转换为 python 中的 YAML 格式以使用 jenkins-job-builder?

python - 将 csv 转换为 json(嵌套对象)

c - 尝试用随机 32 位二进制数填充数组

java - 服务器上的多线程应用程序比单线程慢(与 JUnit 测试不同)

java - 线程启动方法在运行返回之前返回

python - 从 XML 文档中获取所有文本?

python - Tensorflow model.summary() 不显示层信息

c - 从 fifo 标准输出打印到屏幕失败

c - 读取文件并将相同内容保存到新文件中,但不包含文件中的注释

c# - 捕获线程未处理的异常