【发布时间】:2017-08-18 17:31:27
【问题描述】:
(如你所见,我对 Python GIL 和 PYTHON(或 cython)中的多线程等概念不太熟悉)
我在 Cython 中编写了一个函数,该函数由一段代码和一个双 for 循环组成,其中重复调用函数 f。
for i in range(I):
for j in range(J):
res=f(A[i],B[j])
我有一台具有 4 个 CPU 内核的机器,我想并行化的不是第一个循环而是第二个循环。 我找到了this wonderful website,但它没有处理内循环的情况,也没有详细说明。 所以我认为我可以写:
for i in range(I):
#In what case can I release the GIL safely ? Is that necessary at all ?
with nogil, parallel(num_threads=4):
for j in prange(J,shedule="dynamic"):
res=f(A[i],B[j])
这行得通吗?我是否必须将 with nogil 放在两个循环之外,这样它就不会反复运行它来释放和“捕获”这个 GIL 东西?有人可以向我解释一下编写此类语句的方式和逻辑是什么,以便我能够概括出看不见的问题。
【问题讨论】:
标签: python multithreading cython