python multiprocessing调用cython openmp方法需要采用spawn方式
2024-09-18 16:59:59
先说结论,在Linux系统,如果python multiprocessing要调用的cython的方法中包含了多线程,比如openmp C code,必须手动设定spawn方式产生多进程。
更多的细节在 https://pythonspeed.com/articles/python-multiprocessing/
Linux环境缺省多进程会采用fork方式复制新进程,fork方式不会拷贝多线程的各个子线程,程序会卡住。
由于自己写的方法mt_foo中调用了多线程openmp, Linux系统下必须采用spawn方式复制新进程。Windows操作系统不支持fork方式,不存在该问题。
python测试文件test_mpmt.py
import testpyxc.myfunc as myfunc
import numpy as np
import multiprocessing as mp
if __name__ == '__main__':
mp.set_start_method("spawn")
my_pool = mp.Pool(2)
my_rslt = my_pool.map(myfunc.mt_foo, [2,10])
cython文件testpyxc/myfunc.pyx
cimport testpyxc.clib as clib
def mt_foo(int n_thread):
return clib.avg_reduction(n_thread)
testpyxc/clib.pxd
cdef extern from "mpfoo/mpfoo.h":
double avg_reduction(int)
C源文件src/mtavg.c调用openmp
#include<stdio.h>
#include <omp.h>
double avg_reduction(int n_thread) {
int N = 100000000;
int j = 0;
double tavg = 0;
omp_set_num_threads(n_thread);
#pragma omp parallel for reduction(+:tavg)
for (j = 0; j < N; ++j) {
tavg += j;
}
tavg = tavg / N;
return tavg;
}
运行中感觉采用了multiprocessing并行后,再同时使用openmp的性能提高已经很有限,估计和具体进程数,线程数以及电脑硬件的配置有关。
另外,如果在C openmp中设定线程数为1时,不论以fork或者spawn创建多进程,程序可以正常运行,不会卡住没响应。符合预期。线程数大于1时,仅能用spawn.
测试环境: Ubuntu 20.04 LTS
最新文章
- 前端构建大法 Gulp 系列 (一):为什么需要前端构建
- jQuery简单的手风琴菜单
- JVM内存管理------GC简介
- javaee包含的服务和组件
- 深入浅出C++引用(Reference)类型
- 技术博客rss订阅源收集
- php提取字符串中的数字
- 【HDOJ】4986 Little Pony and Alohomora Part I
- Drawable与Bitmap 自定义
- Android窗口管理服务WindowManagerService的简要介绍和学习计划
- ";《算法导论》之‘树’";:二叉查找树
- Linux安装Oracle JDK替换OpenJDK详解
- Dynamics CRM教程:制作普通图表并放入仪表盘中
- Java的selenium代码随笔(1)
- js面向对象高级编程
- lua中的闭包概念的学习笔记
- you need to know those webs !
- sql-pivot
- 条款03 尽可能使用const
- 流畅的python第十六章协程学习记录
热门文章
- springcloud-gateway整合jwt+jcasbin实现权限控制
- mysql 5.7安装教程及密码设置
- 命令行部署KingbaseES流复制+切换测试
- Vue37 常用的组件库
- git操作出现 error: The following untracked working tree files would be overwritten by ...
- cv::Mat::step详解
- 使用NAT网络模式搭建内网,修改IP地址
- 题解 P4317 花神的数论题
- The size of the request headers is too long.
- docker-compose部署rocketmq