Вызов функции, требующей gil, не разрешен без ошибки компиляции gil с C++

По сути, это расширение этого вопроса - Использование threadpoolexecutor в сочетании с cython ногил

В этом случае мой метод 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)

При этом я получаю эти ошибки компиляции. Любая причина, по которой создание экземпляра объекта неверно?

Я попытался сделать точку в качестве указателя и создать экземпляр объекта, и это дает мне ту же ошибку.

   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

person gansub    schedule 29.07.2019    source источник
comment
Я думаю, проблема в except+, но я не знаю, что с этим можно сделать. Разговор, если исключения C++ для Python, безусловно, потребуют GIL, но в равной степени их не обработка автоматически приведет к сбою всей вашей программы.   -  person DavidW    schedule 29.07.2019
comment
@DavidW Спасибо за ваш ответ, как всегда. Вы имеете в виду кроме + для SphericalPoint в файле .pxd? Я удалил его, и я получаю ту же ошибку   -  person gansub    schedule 29.07.2019
comment
Я посмотрю как следует позже. Я думал, что execpt + был и проблемой, и необходимостью (поэтому простое его удаление не было решением). Однако похоже, что я ошибаюсь (удаление его устранило бы непосредственную проблему, но дало бы вам другие проблемы)   -  person DavidW    schedule 29.07.2019


Ответы (1)


Это действительно простая проблема: Cython предполагает, что любой функции нужен GIL, если вы не скажете иначе. В объявлении pxd:

SphericalPoint() nogil except +

Возможно, вы захотите добавить nogil и к другим функциям-членам.


Сначала я подумал, что проблема в аннотации except +. Это заставляет Cython перехватывать любые исключения C++ и преобразовывать их в исключения Python. Для этого требуется GIL, но только в случае перехвата исключения, а Cython позаботится об этом автоматически, так что не беспокойтесь об этом. Альтернативой является сбой всей программы из-за необработанных исключений C++, поэтому вам нужно сохранить файл except +.

person DavidW    schedule 29.07.2019