先说结论,在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方式的更多相关文章

  1. python子类调用父类的方法

    python子类调用父类的方法 python和其他面向对象语言类似,每个类可以拥有一个或者多个父类,它们从父类那里继承了属性和方法.如果一个方法在子类的实例中被调用,或者一个属性在子类的实例中被访问, ...

  2. PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。

    PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...

  3. Android-WebView与本地HTML (Java调用--->HTML的方法)-(new WebView(this)方式)

    之前的博客,Android-WebView与本地HTML (Java调用--->HTML的方法),是在 findViewById(R.id.webview);,来得到WebView, 此博客使用 ...

  4. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

  5. Java调用.NET webservice方法的几种方式

    最近做项目,涉及到web-service调用,现学了一个星期,现简单的做一个小结.下面实现的是对传喜物流系统(http://vip.cxcod.com/PodApi/GetPodStr.asmx?ws ...

  6. python对象调用父类的方法

    #类定义 class People: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __ini ...

  7. python 动态调用模块&类&方法

    转载自:http://www.cnblogs.com/bluefrog/archive/2012/05/11/2496439.html 一直想知道python里有没有类似php中的 $classnam ...

  8. js调用php和php调用js的方法举例

    js调用php和php调用js的方法举例1 JS方式调用PHP文件并取得php中的值 举一个简单的例子来说明: 如在页面a.html中用下面这句调用: <script type="te ...

  9. Java动态调用类中方法

    在Java中,调用类的方法有两种方式:对于静态方法可以直接使用类名调用,对于非静态方法必须使用类的对象调用.反射机制提供了比较另类的调用方式,可以根据需要指定要调用的方法,而不必在编程时确定.调用的方 ...

  10. python cookbook第三版学习笔记十一:类和对象(二)调用父类的方法

    在子类中调用父类的方法,可以下面的A.spam(self)的方法. class A(object):     def spam(self):         print 'A.spam' class ...

随机推荐

  1. fiddler的简单使用

    一.fiddler接口测试介绍 二.fiddler过滤器的使用 fiddler可以指定只抓哪些包,通过filters实现 如果需要抓取多个网站,各个需要抓取的网站之间用分号隔开 三.fiddler抓取 ...

  2. mybatis学习日记3

    1.mybatis的延迟加载 问题:在一对多中,当我们有一个用户,他有100个账户 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来? 解决:在查询用户的时候, ...

  3. 调用HttpClient.PostAsync时传token等值

    做内部接口转发时加token验证需要传token值过去,有如下两种方式 string jsonContent = JsonConvert.SerializeObject(args); using(va ...

  4. Spring IOC官方文档学习笔记(十一)之使用JSR 330标准注解

    1.使用@Inject和@Named进行依赖注入 (1) Spring提供了对JSR 330标准注解的支持,因此我们也可以使用JSR 330标准注解来进行依赖注入,不过,在此之前,我们得先使用mave ...

  5. EPICS Archiver Appliance的定制部署2

    EPICS Archiver Appliance的定制部署1 按上面的步骤Archiver可以跑起来了,试了一下,发现waveform不能archive,看服务状态: 看起来正常,怀疑在profile ...

  6. python flask后端request获取参数的几种方式整理

    最近用 flask 写后端,将获取访问参数的几种方式总结整理一下,仅供参考 从 postman 上来看,调用后端接口传参的方式有两种,一种是 params,参数是以?a=x&b=y 的形式显示 ...

  7. STM32L4 Keil ST-Link 连接失败

    ST-LINK 连接失败的因素,以我个人的经历而言有两种:一个是驱动问题,一个是插线问题.连接正常的情况如下图所示,SWDIO 能显示你的设备信息: 注意使用 SW 端口,JTAG 端口导致无法识别设 ...

  8. IDEA插件Apifox,一键自动生成接口文档!

    有关Apifox软件之前写过一篇文章: 接口测试神器Apifox,亲测好用! 如何一键自动生成数据库文档之前也写过一篇文章: 数据库界的Swagger:一键生成数据库文档! 一.Apifox插件的优势 ...

  9. Cesium之Quick Start

    1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...

  10. JS的有关递归的知识点(数据无限级联的实现)

    所用测试数据: 1 const data = [ 2 { 3 "area_id": 5, 4 "name": "广东省", 5 " ...