先说结论,在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

最新文章

  1. 前端构建大法 Gulp 系列 (一):为什么需要前端构建
  2. jQuery简单的手风琴菜单
  3. JVM内存管理------GC简介
  4. javaee包含的服务和组件
  5. 深入浅出C++引用(Reference)类型
  6. 技术博客rss订阅源收集
  7. php提取字符串中的数字
  8. 【HDOJ】4986 Little Pony and Alohomora Part I
  9. Drawable与Bitmap 自定义
  10. Android窗口管理服务WindowManagerService的简要介绍和学习计划
  11. &quot;《算法导论》之‘树’&quot;:二叉查找树
  12. Linux安装Oracle JDK替换OpenJDK详解
  13. Dynamics CRM教程:制作普通图表并放入仪表盘中
  14. Java的selenium代码随笔(1)
  15. js面向对象高级编程
  16. lua中的闭包概念的学习笔记
  17. you need to know those webs !
  18. sql-pivot
  19. 条款03 尽可能使用const
  20. 流畅的python第十六章协程学习记录

热门文章

  1. springcloud-gateway整合jwt+jcasbin实现权限控制
  2. mysql 5.7安装教程及密码设置
  3. 命令行部署KingbaseES流复制+切换测试
  4. Vue37 常用的组件库
  5. git操作出现 error: The following untracked working tree files would be overwritten by ...
  6. cv::Mat::step详解
  7. 使用NAT网络模式搭建内网,修改IP地址
  8. 题解 P4317 花神的数论题
  9. The size of the request headers is too long.
  10. docker-compose部署rocketmq