我有以下Cython
代码:
from cython import parallel from libc.stdio cimport printf def test_func(): cdef int thread_id = -1 with nogil, parallel.parallel(num_threads=10): thread_id = parallel.threadid() printf("Thread ID: %d\n", thread_id)
但是,它始终只启动一个线程,即始终只输出
Thread ID: 0
我在做多线程时做错了什么?
Cython使用OpenMP来实现多线程功能.
要启用OpenMP,编译器将需要在编译和链接时传递一个额外的标志,否则将忽略代码的并行部分.
一些流行的编译器的标志如下:
GCC = -fopenmp
MSVC =/openmp
icc = -openmp
假设您已将函数保存在文件中test.pyx
,setup.py
则在使用GCC时,以下内容应该有效.
from distutils.core import setup, Extension from Cython.Build import cythonize extensions = [Extension( "test", sources=["test.pyx"], extra_compile_args=["-fopenmp"], extra_link_args=["-fopenmp"] )] setup( ext_modules = cythonize(extensions) )
一旦这样编译,代码应该在运行时产生10个线程:
In [1]: import test In [2]: test.test_func() Thread ID: 9 Thread ID: 1 Thread ID: 6 Thread ID: 7 Thread ID: 3 Thread ID: 8 Thread ID: 5 Thread ID: 4 Thread ID: 0 Thread ID: 2
如果你想在cython文档中获得比这个页面更多的信息,那么有一个很好的基本指南,介绍如何使用cython进行并行化.