python multiprocessing调用cython openmp方法需要采用spawn方式
先说结论,在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
python multiprocessing调用cython openmp方法需要采用spawn方式的更多相关文章
- python子类调用父类的方法
python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...
- PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。
PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...
- Android-WebView与本地HTML (Java调用--->HTML的方法)-(new WebView(this)方式)
之前的博客,Android-WebView与本地HTML (Java调用--->HTML的方法),是在 findViewById(R.id.webview);,来得到WebView, 此博客使用 ...
- uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式
前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...
- Java调用.NET webservice方法的几种方式
最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...
- python对象调用父类的方法
#类定义 class People: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __ini ...
- python 动态调用模块&类&方法
转载自:http://www.cnblogs.com/bluefrog/archive/2012/05/11/2496439.html 一直想知道python里有没有类似php中的 $classnam ...
- js调用php和php调用js的方法举例
js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...
- Java动态调用类中方法
在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方 ...
- python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法
在子类中调用父类的方法,可以下面的A.spam(self)的方法. class A(object): def spam(self): print 'A.spam' class ...
随机推荐
- selenium注入js代码
from selenium import webdriver from selenium.webdriver import ActionChains import time dr = webdrive ...
- 电商网站Web自动化测试实战( 编写京东搜索脚本python+selenium框架)
电商网站Web自动化测试实战( 编写京东搜索脚本) 1,打开京东页 京东首页地址:https://www.jd.com/,故进入京东首页如下: 2,打开浏览器开发者模式 定位元素前需先打开浏览器开发者 ...
- 学习Java Day8
今天学习了for循环,与C语言几乎无差异: 也学习了while和do while循环 今天学习了for循环,与C语言几乎无差异: 也学习了while和do while循环
- vue页面加载闪烁的问题以及解决方案
一.原因: 问题:当我们打开Vue页面的时候,如果弱网环境,会出现一个闪烁的效果下图:加载闪烁问题效果 原因:因为在浏览器中先执行html代码,先渲染Dom,然后再执行JavaScript代码,Vue ...
- echarts的颜色渐变
官网文档解释 // 线性渐变,前四个参数分别是 x0, y0, x2, y2, //范围从 0 - 1,相当于在图形包围盒中的百分比, //如果 global 为 `true`,则该四个值是绝对的像素 ...
- JS逆向实战11——某金属集团动态cookie加密
本文来自:来自: https://www.cnblogs.com/zichliang/ 目标网站 aHR0cDovL3d3dy50bm1nLmNvbS5jbi9pbmZvcm1hdGlvbi9pbmZ ...
- SQL Server数据库日常检查
1.1代码检查从昨天到现在,SQL代理Job有没有运行失败的,会把运行失败的Job名字,步骤,运行时间,错误等级,错误原因罗列出来,方便查看. ----1.1 Check Job Fail List ...
- 推荐一个分布式单点登录框架XXL-SSO!
有关单点登录(SSO)之前有写过两篇文章 一文读懂 JWT! 看完这篇不能再说不懂SSO原理了! 如果说XXL-JOB你可能并不陌生,它是非常火爆的一个分布式任务调度平台.但其实在该作者还有一个非常优 ...
- JZOJ 4366. 【GDKOI2016】项链
\(\text{Problem}\) 给出一个项链,删去连续的一部分,使剩下的对称,且长度最长 \(\text{Analysis}\) 可以发现,剩下的合法项链一定是由两个回文串接起来(由对称性质可知 ...
- Android:ViewModel
什么是 ViewModel ViewModel 旨在以注重生命周期的方式存储和管理界面相关数据.ViewModel 让数据可在发生屏幕旋转等配置更改后继续留存. 上面一段话是截取自官方文档对 View ...