Parallel processing 在prange返回值后,cython代码继续

Parallel processing 在prange返回值后,cython代码继续,parallel-processing,return,cython,Parallel Processing,Return,Cython,假设我有以下函数: @cython.boundscheck(False) @cython.wraparound(False) cpdef bint test(np.int_t [:] values): cdef Py_ssize_t n_values = len(values) cdef int i for i in prange(n_values,nogil=True): if i ==0: return 0 print

假设我有以下函数:

@cython.boundscheck(False)
@cython.wraparound(False)
cpdef bint test(np.int_t [:] values):
    cdef Py_ssize_t n_values = len(values)
    cdef int i
    for i in prange(n_values,nogil=True):
        if i ==0:
            return 0

    print 'test'
我是这样运行的:

In [1]: import algos

In [2]: import numpy as np

In [3]: algos.test(np.array([1,2,3,1,4,5]))
test
Out[3]: False
为什么该功能本应在未打印的情况下退出,却仍在打印?有没有办法让函数在返回时退出

谢谢。

。我认为他们没有弄清楚的另一个复杂问题是,如果迭代次数足够少(只要完成了一个线程),你也可以在
prange
之后继续,这就是你所看到的

对我来说,似乎有效的方法是使用循环的
else
子句,它只有在没有提前完成时才会执行:

for i in prange(n_values,nogil=True):
    # stuff ...
else:
    with gil:
        print "test"

快速查看C代码表明,这是适当的检查,应该是可靠的。

不过,老实说,这看起来很像一个bug,因为它似乎发生在任何大小的
prange
上,因此可能值得报告。