当前位置: 首页 > news >正文

python serial_浅谈python中的多线程和多进程

573c850e46bf1149f1be0ebfa6fc5e1e.png

原创:hxj7

本文以一个简单的例子介绍python中多线程和多进程的差别。

我们在进行生信分析时经常要处理大文件,如果用串行运算往往费时,所以需要并行运算以节省时间。目前,流行的生信工具通常都可以并行运算,比如bwa。通常来讲,我们进行并行运算可以选择多线程或者多进程。那么二者有什么差别呢,我们又该如何选择呢?

不同编程语言中的多线程和多进程实现机制是不一样的,其实我们不关心实现机制,我们关注的是实际的性能。本文以python语言为例,用一个测试脚本来比较python中多线程和多进程的性能区别。我们主要关注运行时间和内存占用情况。

我们知道,python中常用的多线程模块是threading,常用的多进程模块是multiprocessing。我们的测试脚本要解决的是一个运算量比较大的任务,根据是否(并行)运算以及使用哪种并行运算可以分为四种情形:

  • 不进行计算
  • 串行运算
  • 多线程运算
  • 多进程运算

得到的结果如下:

6db06dfb237f52a0b3a7660013c066e0.png

从中可以看出,对这个运算任务以及测试脚本而言,与串行运算相比,多线程所用的时间多很多,所占的内存一样;而多进程所用的时间变少(大约是串行运算时间的一半),所占用的内存变大(大约是串行运算的三倍)。

上述结果值得讨论的有两个:

  1. 为什么python中多线程运算所用的时间比串行运算还多?
    这是因为python中GIL(Global Interpreter Lock)的存在使得对一个进程而言,不管有多少线程,任一时刻,只会有一个线程在执行。对于CPU密集型的线程,由于系统调度等其它时间花销,其效率不仅仅不高,反而有可能比较低[1]。也就是说,python中的多线程运算不能算作真正的并行运算。上面例子中的任务正好是一个CPU密集型任务,所以用多线程运算的时间反倒比串行运算还多。
  2. 为什么多线程运算占用的内存和串行运算一样,而多进程所用内存比串行运算大很多?
    这是一个正常的结果,是由线程和进程的特点决定的。简单来说,线程会共享所属进程的内存资源,所以不会有额外的内存占用;而子进程会从父进程那里拷贝一份内存资源,所以每多一个子进程,就会多一份内存资源的拷贝,占用的内存就多了,上面的例子中共有两个子进程,所以就会多出来两份内存拷贝,看起来所占用的内存就是串行运算的三倍。(所用的术语只是为了阐述方便而用,可能有不恰当的地方)

综上,由于生信分析大多是CPU密集型(计算密集型)的任务,如果你用python来处理此类任务,多进程并行运算可能更适合。

参考

[1] https://www.cnblogs.com/yssjun/p/11302500.html

所用的测试脚本如下:

#!/usr/bin/python

(公众号:生信了)

相关文章:

  • StatCVS 对使用CVS的项目进行深入统计的开源工具
  • 2020无人用的邮箱和密码大全_2020年之微波炉怎么用 微波炉使用注意事项大全
  • 用C原生API写Symbian日志文件
  • go make function_Go中复制文件的3种技巧
  • 猪猪宝贝
  • 简述python文件操作_Python文件操作的几个要点与示例
  • 读书小结
  • tomcat线程被打满怎么排查_Tomcat面试题(2020最新版)
  • oc引导开机直接进_超级详细的oc引导制作过程(二)——config.plist的制作,从入门到入土...
  • 2007年你需要知道的五大技术
  • python中reader_关于Python 的这几个技巧,你应该知道
  • SVN时代...
  • sift算法双向匹配剔除不匹配点_【动手学计算机视觉】第七讲:传统目标检测之SIFT特征...
  • SVN应用
  • python怎么训练模型_如何在训练堆叠模型后预测python的数据?
  • 自己简单写的 事件订阅机制
  • 2019.2.20 c++ 知识梳理
  • ECS应用管理最佳实践
  • Flannel解读
  • GitUp, 你不可错过的秀外慧中的git工具
  • input的行数自动增减
  • javascript 总结(常用工具类的封装)
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Laravel 实践之路: 数据库迁移与数据填充
  • PAT A1050
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • web标准化(下)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 反思总结然后整装待发
  • 基于游标的分页接口实现
  • 力扣(LeetCode)965
  • 每天10道Java面试题,跟我走,offer有!
  • 排序算法之--选择排序
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何选择开源的机器学习框架?
  • 什么是Javascript函数节流?
  • 树莓派 - 使用须知
  • 说说动画卡顿的解决方案
  • 微服务框架lagom
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #考研#计算机文化知识1(局域网及网络互联)
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (剑指Offer)面试题34:丑数
  • (离散数学)逻辑连接词
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net反混淆脱壳工具de4dot的使用
  • .sdf和.msp文件读取