不允许调用 gil 要求函数,否则 gil 编译错误与 C++



它本质上是这个问题的扩展 - 线程池执行器与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 +

最新更新