没有C的gil编译错误,不允许调用需要gil的函数

时间:2019-07-29 05:44:13

标签: c++ compiler-errors cython gil

这本质上是该问题的扩展-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

1 个答案:

答案 0 :(得分:1)

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

SphericalPoint() nogil except +

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


我最初认为问题是except +注释。这导致Cython捕获任何C ++异常并将其转换为Python异常。这确实需要GIL,但前提是必须捕获到异常,并且Cython会自动处理此问题,因此不必担心。替代方法是由于未处理的C ++异常导致整个程序崩溃,因此您需要保留except +