在没有使用 C++ 的 gil 编译错误的情况下,不允许调用需要 gil 的函数
Calling gil-requiring function not allowed without gil compilation error with C++
本质上是这个问题的延伸-
在这种情况下,我的 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 +
.
本质上是这个问题的延伸-
在这种情况下,我的 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 +
.