这本质上是该问题的扩展-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()
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
答案 0 :(得分:1)
这是一个非常简单的问题:Cython假定任何函数都需要GIL,除非您另行告知。在pxd声明中:
SphericalPoint() nogil except +
您可能也想将nogil
添加到其他成员函数中。
我最初认为问题是except +
注释。这导致Cython捕获任何C ++异常并将其转换为Python异常。这确实需要GIL,但前提是必须捕获到异常,并且Cython会自动处理此问题,因此不必担心。替代方法是由于未处理的C ++异常导致整个程序崩溃,因此您需要保留except +
。