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

2024-10-01 09:17:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个非常具体的需求: 我想用Qt小部件创建一个python控制台,并且能够有几个独立的解释器。 现在,让我试着解释一下我的问题在哪里,以及我所做的所有尝试,按照我最想做的事情的顺序来处理那些我可以默认使用的问题

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

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

  • 最后,我有最后一个想法,它的风险相对较慢:在C++中有一个专用的线程来运行解释器,并且用Python做每一件事情来管理输入/输出。当作业需要执行一个循环时,可能会有一个作业需要执行。似乎不是很难做到,但我更喜欢问你:有没有一种方法可以使上述可能性发挥作用,还是有其他方法我没有考虑过,或者我最后的想法是最好的?


Tags: 方法函数代码read顺序部件作业pyrun
2条回答

另一种方法是重用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。在

如果您的主要需求是有几个相互独立的解释器,那么您可能更适合使用fork()和exec()而不是多线程处理。在

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

相关问题 更多 >