我有一个非常具体的需求: 我想用Qt小部件创建一个python控制台,并且能够有几个独立的解释器。 现在,让我试着解释一下我的问题在哪里,以及我所做的所有尝试,按照我最想做的事情的顺序来处理那些我可以默认使用的问题
第一点是pythoncapi(PyRun[…]、PyEval[…])中的所有函数都需要GIL锁定,这将禁止任何来自C的并发代码解释(否则我真的很高兴错了!!!:D)
因此,我尝试了另一种方法,而不是“通常的方法”:我在python中创建了一个循环,对我的特殊文件调用read()并计算结果。此函数(作为构建的扩展实现)将阻塞,直到有数据可读取。(实际上,目前在C代码中使用的是一段时间,而不是基于pthread的条件) 然后,使用PyRun_simpleString()在另一个线程中启动循环。这就是问题所在:我的read函数,除了阻塞当前线程(这是完全正常的),它还阻塞了整个解释器,PyRun_simpleString()没有返回。。。
另一种方法是重用IPython及其Qt Console中的代码。这假设独立的解释器不共享内存。IPythons在多个进程中运行Python解释器,并在ZeroMQ的帮助下通过TCP或Unix域套接字与它们通信。在
另外,根据您的问题,我不确定您是否知道Python C扩展中常见的阻塞I/O习惯用法:
这将释放GIL,以便其他线程可以在函数阻塞时执行Python代码。见Python/C API Reference Manual: Thread State and the Global Interpreter Lock。在
如果您的主要需求是有几个相互独立的解释器,那么您可能更适合使用fork()和exec()而不是多线程处理。在
这样,每个口译员都会住在自己的地址空间中,而不会打扰其他人。在
相关问题 更多 >
编程相关推荐