Я перебор с помощью Прейнджа по списку, как это:Cython parallel prange - местность резьбы?
from cython.parallel import prange, threadid
cdef int tid
cdef CythonElement tEl
cdef int a, b, c
# elList: python list of CythonElement instances is passed via function call
for n in prange(nElements, schedule='dynamic', nogil=True):
with gil:
tEl = elList[n]
tid = threadid()
a = tEl.a
b = tEl.b
c = tEl.c
print("thread {:} elnumber {:}".format(tid, tEl.elNumber))
#nothing is done here
with gil:
print("thread {:} elnumber {:}".format(tid, tEl.elNumber))
# some other computations based on a, b and c here ...
я ожидаю выход, как это:
thread 0 elnumber 1
thread 1 elnumber 2
thread 2 elnumber 3
thread 3 elnumber 4
thread 0 elnumber 1
thread 1 elnumber 2
thread 2 elnumber 3
thread 3 elnumber 4
Но я получаю:
thread 1 elnumber 1
thread 0 elnumber 3
thread 3 elnumber 2
thread 2 elnumber 4
thread 3 elnumber 4
thread 1 elnumber 2
thread 0 elnumber 4
thread 2 elnumber 4
Итак, как-то нить Локальная переменная tE1 будет перезаписана в потоках? Что я делаю не так ? Спасибо!
Вы правы. Кажется, он не создает поток 'tEl' thread-local (посмотрите на сгенерированный файл C и найдите' lastprivate' для проверки). Если вы измените его на базовый тип (например, 'double'), он работает, но не кажется с типом объектов Cython. Я не знаю очевидного решения, но, возможно, стоит записать ошибку github – DavidW