2

我有一个非常具体的需求:我想创建一个带有 Qt Widget 的 python 控制台,并且能够拥有多个独立的解释器。现在让我尝试解释我的问题在哪里以及我所做的所有尝试,按照我最想对那些我可以默认使用的人进行排序

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

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

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

4

2 回答 2

3

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

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

Py_BEGIN_ALLOW_THREADS
... 做一些阻塞 I/O 操作 ...
Py_END_ALLOW_THREADS

这会释放 GIL,以便其他线程可以在您的函数阻塞时执行 Python 代码。请参阅Python/C API 参考手册:线程状态和全局解释器锁

于 2014-03-16T10:15:36.120 回答
0

如果您的主要要求是拥有多个相互独立的解释器,那么您可能更适合执行 fork() 和 exec() 而不是执行多线程。

这样,每个解释器都将生活在自己的地址空间中,而不会干扰其他解释器。

于 2014-03-16T10:17:34.823 回答