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

标签 python c pthreads multiprocessing named-pipes

我想了解人们对于在实现线程间命名管道通信的不同解决方案之间选择哪个方向的意见。

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

所以堆栈是: 第三个 p 二进制文件 -> 我的共享对象/dll 'python-bridge' -> python 2.7.5 解释器(持久)

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

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

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

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

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

你有什么建议?

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

感谢您的帮助,Tijs

最佳答案

回答我自己的问题:

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

关于python - 嵌入式CPython,使用命名管道进行线程交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18686796/

相关文章:

c++ - 结构中的 vector 不会让我 push_back

python - 如何将大量数据传递给 celery

python - 带 zip 的 For 循环

c - Windows API的CreateFile()中OPEN_ALWAYS和CREATE_ALWAYS的区别

c - C可变参数宏是否能够递归扩展##__VA_ARGS__?

c - 使用 C 代码复制 .dat 文件时出现额外字符

c++ - 如何在 C++ 中将 vector<int> 正确传递给 pthread_create?

python - 使用 Dask 在大型集合上映射可变执行时间的函数

python - Pandas:使用列中已有的特定有序值填充缺失的索引。

创建多线程进行平方根运算