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 ...
随机推荐
- 如何在WSL下交叉编译openwrt
首先我们需要准备一个大小写敏感的文件夹. 然后拉取代码,并且执行代码的先决条件脚本. 注意,如果过程中某项条件不符,你可能要临时修复. 假如下图的组件判定失败(即出现ok=>fail) 那么你就 ...
- j-link "the connected j-link is defective"问题的解决
出现这个原因是 J-link和J-link的驱动不匹配,比如J-link的固件太老,J-link驱动太新.因此要解决的话,要不就是换不同版本的J-link驱动,要不就是换J-Link或升级J-link ...
- sqlmap 简单使用
sqlmap 简单使用 环境:phpstudy:MySQL5.4.7 介绍 sqlmap是一个开源的渗透测试工具,它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程.它有一个强大的检测引擎 ...
- 有趣的python库-pyttsx3
pyttsx3-语音播报功能 基本使用: import pyttsx3 px = pyttsx3.init() px.say("hello world") px.runAndWai ...
- jenkins简单安装及配置(Windows环境
jenkins简单安装及配置(Windows环境) jenkins是一款跨平台的持续集成和持续交付.基于Java开发的开源软件,提供任务构建.持续集成监控的功能,可以使开发测试人员更方便的构建软件项目 ...
- JZOJ 6800.NOIP2020.9.19模拟spongebob
题目大意 求形如 \[\sum_{i=1}^n |a_ix + b_i| \] 的最小值 思路 我们显然可以先把系数 \(a\) 提出来 于是就成了 \(\sum_{i=1}^n |a_i|·|x + ...
- MATH026th: 《古今算学丛书》目录
http://aiguji.net/2202.html 出版时间: 光绪二十四年(1898)上海算学书局据微波榭本等石印 <古今算学丛书>,刘铎辑,有光绪二十四年(1898)上海算学书局石 ...
- vue动态绑定类名
<view :class="[index == 0 ? 'bgpvip' : 'bgsvip' ,bg]"> 1.class前面需要加: 2.多个类名可以使用数组的方式 ...
- 15.网关Gateway
创建网关的Module 使用注册中心和配置中心 详细可以参考另两篇篇博客-注册中心和配置中心 报错 编译报了这个错,原因是我们没有给网关配置数据库连接字符串,但是引用了common,common中有m ...
- lg7335 [JRKSJ R1] 异或 题解
本题的标签中含有trie,但是这道题可以不用trie做. 考虑列出本题的dp方程:设\(f_{k,i}\)表示前\(i\)个数选了\(k\)段的答案,\(s_i\)为数组的前缀异或和 当不选择第\(i ...