嵌入式CPython,使用命名管道的线程交互



我想听听人们对在不同解决方案之间进行选择以实现线程间命名管道通信的方向的意见。

我正在研究以下解决方案:AIX 上的第三方二进制文件调用共享对象。我使用 python 2.7.5 api 构建了这个共享对象,所以我有一个 python 线程(64 位)。

所以堆栈是:3rd p 二进制 -> 我的共享对象/DLL 'python-bridge' -> python 2.7.5 解释器(持久)

从第三方二进制文件(专有语言)中的自定义代码中,我通过 python-bridge 初始化 python 解释器,通过 python-bridge 预编译 python 代码块,并使用桥中的PyEval_EvalCode执行这些代码位。python 解释器在会话期间保持活动状态,并在会话结束前关闭。

简单的顺序python代码工作正常,快速。调用共享对象方法后,python 引用全部减少(在方法内部),并且没有垃圾留下。预编译的python模块保留在内存中,工作正常。但是,我还需要与主可执行文件的流数据进行交互。该可执行文件(我没有源代码)通过命名管道支持 fifo,我想将其用于线程间通信。

由于命名管道阻塞,因此我需要一个单独的线程。

我想出了 3 或 4 个替代方案(随时提供更多建议)

  1. 使用 python 中的多进程模块
  2. 使用pthread_create制作我自己的 C 线程,并在其中使用 python(仔细地,我知道非线程安全问题)
  3. 使用pthread_create创建我自己的 C 线程,从 C 解析命名管道,并从那里调用 python 解释器主线程
  4. 也许可能?)使用python更简单的线程模块(这不是"纯"线程),并在对桥的API调用结束时释放GIL。(不敢这样做,这里需要有见识的人。使用线程和睡眠的简单测试表明它在 python 调用中工作,但命名管道线程在返回到主要的非 python 进程后什么也没做)

你有什么建议?

我目前正在尝试选项 1,取得了一些成功,但仅仅为了解析命名管道而生成一个新进程"感觉"有点臃肿。

谢谢你的帮助,Tijs

回答我自己的问题:

我已经使用选项 4 实现了这一点(不久前)。效果很好,非常稳定。在我第一次尝试时没有发布 GIL,因为我没有初始化线程。之后,一帆风顺。

最新更新