加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Cython中的并行性不起作用

发布时间:2020-12-20 11:46:51 所属栏目:Python 来源:网络整理
导读:我有一个以下的Cython代码: from cython import parallelfrom libc.stdio cimport printfdef test_func(): cdef int thread_id = -1 with nogil,parallel.parallel(num_threads=10): thread_id = parallel.threadid() printf("Thread ID: %dn",thread_id)
我有一个以下的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: %dn",thread_id)

但是,它始终只启动一个线程,即始终只输出

Thread ID: 0

我在做多线程时做错了什么?

解决方法

Cython使用 OpenMP的多线程功能.

要启用OpenMP,编译器将需要在编译和链接时传递一个额外的标志,否则将忽略代码的并行部分.

一些流行的编译器的标志如下:

> GCC = -fopenmp
> MSVC = / openmp
> icc = -openmp

假设您已将函数保存在test.pyx文件中,则在使用GCC时,以下setup.py应该可以正常工作.

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 docs中获得比this页面更多的信息,那么如何使用cython的并行性有一个很好的基本指南.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读