gpt4 book ai didi

c++ - 在没有使用 C++ 的 gil 编译错误的情况下,不允许调用需要 gil 的函数

转载 作者:行者123 更新时间:2023-11-28 04:13:02 26 4
gpt4 key购买 nike

它本质上是这个问题的延伸 - Usage of threadpoolexecutor in conjunction with cython's nogil

在这种情况下,我的 getArea2() 方法略有不同

cdef int getArea2(self,double[:] p) nogil:
cdef int area
cdef SphericalPoint spoint
spoint = SphericalPoint()
area = 0
area = self.rect.getArea()
return area

.pxd 声明略有不同

cdef extern from "Point.h":


cdef cppclass SphericalPoint(Point):
SphericalPoint() except +
double getCoordinate1()
double getCoordinate2()
void setCoordinate1(double lat)
void setCoordinate2(double lon)

有了这个,我得到了这些编译错误。对象实例化不正确的任何原因?

我尝试将 spoint 作为指针并实例化对象,但它给了我同样的错误

   cdef SphericalPoint *spoint
spoint = new SphericalPoint()

编译 Cython 文件时出错:

cdef int getArea2(self,double[:] p) nogil:
cdef int area
cdef SphericalPoint spoint
spoint = SphericalPoint()
^
------------------------------------------------------------

test.pyx:78:30: Calling gil-requiring function not allowed without gil

最佳答案

这是一个非常简单的问题:Cython 假定任何函数都需要 GIL,除非您另有说明。在 pxd 声明中:

SphericalPoint() nogil except +

您可能还想将 nogil 添加到其他成员函数中。


我最初认为问题出在 except + 注释上。这会导致 Cython 捕获任何 C++ 异常并将它们转换为 Python 异常。这确实需要 GIL,但前提是捕获到​​异常,并且 Cython 会自动处理这个问题,所以不用担心。另一种方法是整个程序因未处理的 C++ 异常而崩溃,因此您确实需要保留 except +

关于c++ - 在没有使用 C++ 的 gil 编译错误的情况下,不允许调用需要 gil 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57247759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com