python如何调用c函数实现真正意义的多线程_多线程环境下Python<>C之间的通信

首先是问题的设置+-------------+

Python P0 P1 P1

+ ^ + ^ +

+------------+ | | | | |

| + v + v

Cython +->C0 C1 C1

+ ^ + ^ +

+------------+ | | | | |

| +----------+-v-----+

C +->F0... +--+ | | +------>...

+----+-v-----------+

+------------+

程序的入口点是Python函数P0,它通过Cython调用C函数F0(从用户库)。这个C函数使用OpenMP创建多个线程。每个线程都使用cython中的回调函数调用python函数P1以并行运行。这些P1函数返回一个要返回到C代码中的值。问题是:如何使用内部C多线程的cython回调正确调用P1。在

我在这里读到的帖子只是单方面的Python或者Cython通信或者Python调用Cython的问题省略了。在

那么,该如何处理呢?在

因为使用了Cython,所以C的API被丢弃了。最可能的解决方案与Cython中的with gil/nogil选项有关。在

我的想法是nogil应该放在C0上,因为代码进入C库,gil在C1上。在

^{pr2}$

回到图表中+-------------+

Python P0 P1 P1

+ ^ + ^ +

+------------+ | | | | |

| + v + v

Cython +->(C0) nogil (C1 C1) with gil

+ ^ + ^ +

+------------+ | | | | |

| +----------+-v-----+

C +->F0... +--+ | | +------>...

+----+-v-----------+

+------------+

然而,我的经验是,P1函数中的一个永远不会正确返回Cython,代码仍然会无限期地等待P1返回。在

对于从P1返回时代码被卡住的正确答案或解释是什么?在

ADD1:该代码是一个测试示例,可以完美地使用一个线程(或者OpenMP设置为一个线程)。同时,多线程测试在不使用Python/Cython接口的情况下工作,纯粹是一个C/C++示例。因此,这个问题与GIL或Python/Cython中的线程有关。在

你可能感兴趣的:(python如何调用c函数实现真正意义的多线程_多线程环境下Python<>C之间的通信)