【发布时间】:2017-06-22 05:44:59
【问题描述】:
我不明白为什么我收到一条错误消息:
在没有 gil 的情况下不允许丢弃拥有的 Python 对象
我的代码是 C 类型扩展,所以它真的不应该是 Python 对象,但在这种情况下我不能应用 nogil。我有点不知道为什么会这样。
cdef class Fraction:
cdef int _numerator
cdef int _denominator
cdef int numerator
cdef int denominator
def __cinit__(self, numerator=0, denominator=None, bint _normalize=True):
self._numerator = numerator
self._denominator = denominator
@cython.boundscheck(False)
@cython.wraparound(False)
cpdef gaussian_inverse_cy():
cdef int a = 1, b = 2, i
with nogil:
for i in prange(10000):
Fraction(a,b)
【问题讨论】:
-
确实是一个 Python 对象。 cdef 类让您创建一个新的内置 Python 类型 docs.cython.org/en/latest/src/userguide/… ,没有 gil 就无法创建/操作。
-
您可以将它放在一个小的
with gil:块中。显然,在这种情况下,这将是整个循环,但在实际示例中,它可能只是循环的一小部分。我认为您应该仍然能够在没有 GIL 的情况下访问cdef属性(一旦创建)。 -
@MLhacker 看看这是否有帮助:stackoverflow.com/a/21135087/6037118