prange返回值后,cython代码继续

时间:2017-04-16 14:41:28

标签: 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 '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

为什么功能打印应该在没有打印的情况下退出?有没有办法让函数在到达返回时退出?

谢谢。

1 个答案:

答案 0 :(得分:1)

documentation is clear that this is a bit of a minefield since there's no guarantee which iteration finishes first。我认为他们没有明确表达的额外复杂性是,如果迭代次数足够小(如果完成一个线程),你也可以在prange之后继续,这就是你见。

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

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

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