【问题标题】:Calling gil-requiring function not allowed without gil compilation error with C++在没有使用 C++ 的 gil 编译错误的情况下,不允许调用 gil-requiring 函数
【发布时间】:2019-07-29 05:44:13
【问题描述】:

本质上是这个问题的延伸——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

【问题讨论】:

  • 我认为问题出在except+,但我不知道你能做些什么。如果 C++ 到 Python 异常的对话肯定需要 GIL,但同样不处理它们会自动使你的整个程序崩溃
  • @DavidW 一如既往地感谢您的回复。您是指 .pxd 文件中 SphericalPoint 上的 except + 吗?我删除了它,我得到了同样的错误
  • 稍后我会好好看看。我的想法是 execpt + 既是问题又是必要的(所以简单地删除它不是解决方案)。但是,听起来我错了(删除它可以解决当前的问题,但会给您带来其他问题)

标签: c++ compiler-errors cython gil


【解决方案1】:

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

SphericalPoint() nogil except +

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多