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

时间:2013-09-08 17:51:21

标签: python c pthreads multiprocessing named-pipes

我希望人们在不同的解决方案之间选择哪个方向来实现线程间命名管道通信。

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

所以堆栈是: 第三个二进制 - >我的共享对象/ 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. 中的多进程模块
  3. 使用pthread_create制作我自己的C线程,并在那里使用python(小心,我知道非线程安全问题)
  4. 使用pthread_create创建我自己的C线程,从C解析命名管道,并从那里调用python解释器主线程
  5. (可能吗?)使用python的简单Threading模块(不是'纯'线程),并在API调用结束时释放GIL。 (不敢这样做,需要有洞察力的人。使用Threading和sleep进行简单测试表明它在python调用中工作,但命名管道Thread在返回主非python进程后什么都不做)
  6. 你有什么建议?

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

    感谢您的帮助,Tijs

1 个答案:

答案 0 :(得分:1)

回答我自己的问题:

我已经使用选项4实现了这一步(一会儿)。工作良好,非常稳定。 在我的第一次尝试中没有发布GIL,因为我没有初始化线程。 之后,一帆风顺。