2017-03-13 1 views
2

나는 Cython을 통해 파이썬에 접근 할 수있게 해주는 std :: thread를 사용하는 몇 가지 메소드를 가진 C++ 클래스를 가지고있다. 내 Cython 코드에서 nogill 지시문을 어디에 넣고 싶습니까? 클래스 메서드를 선언 할 때 또는 Cython 래퍼 클래스를 만들 때 넣을 수 있습니까?다중 스레드 C++ 클래스에 대해 Cython에서 GIL을 해제하는 방법은 무엇입니까?

cdef extern from "Rectangle.h" namespace "shapes": 
    cdef cppclass Rectangle: 
     Rectangle() except + 
     Rectangle(int, int, int, int) except + 
     int x0, y0, x1, y1 
     int getArea() 
     void getSize(int* width, int* height) 
     void move(int, int) 

사이 썬 래퍼 클래스 :

cdef class PyRectangle: 
    cdef Rectangle c_rect  # hold a C++ instance which we're wrapping 
    def __cinit__(self, int x0, int y0, int x1, int y1): 
     self.c_rect = Rectangle(x0, y0, x1, y1) 
    def get_area(self): 
     return self.c_rect.getArea() 
    def get_size(self): 
     cdef int width, height 
     self.c_rect.getSize(&width, &height) 
     return width, height 
    def move(self, dx, dy): 
     self.c_rect.move(dx, dy) 

답변

3

당신은 아마 실제로 할 필요가 사용하는 클래스를 선언

: 나는 아래의 사이 썬의 문서에서 예제 클래스를 사용했습니다 nogil. GIL은 simulatenously 실행되는 여러 파이썬 스레드를 멈 춥니 다. 그러나 C++ 쓰레드를 사용하고 있다면 GIL에 상관없이 백그라운드에서 매우 행복하게 실행할 수 있습니다. 단, PyObject을 사용하거나 파이썬 코드를 실행하려고하지 않는다면 말입니다. 그래서 내 의혹은 당신이 GIL을 오해했고 당신은 그것에 대해 생각하지 않고 떠날 수 있다는 것입니다.

그러나 실제로 그것을 해제 하시겠습니까 가정, 당신은이 일을해야합니다

  1. 마크 C++ 그들이 GIL을 필요로하지 않는 사이 썬 말할 nogil 같은 기능을합니다.

    cdef cppclass Rectange: 
        Rectangle(int, int, int, int) nogil except + 
        int getArea() nogil 
        # ... 
    
  2. 가 가 GIL이 영역을 표시하는 당신의 사이 썬 래퍼 클래스의

    사용 with nogil: 블록입니다

  3. : 그냥 사이 썬를 할 수 있습니다 그것을 떼어도 문제가되지 않습니다 알고있다 -이 사실을 공개하지 않습니다 실제로 발표했다. 그것은 파이썬 객체를 생성하는 것을 포함하기 때문에 return 문이 with nogil 블록 내부에 존재할 수 없기 때문에

    cdef class PyRectangle: 
        # ... 
        def __cinit__(self, int x0, int y0, int x1, int y1): 
         with nogil: 
          self.c_rect = Rectangle(x0, y0, x1, y1) 
        def get_area(self): 
         cdef int result 
         with nogil: 
          result = self.c_rect.getArea() 
         return result 
    

    get_area은 약간 더 복잡해진다.

관련 문제