python多线程和多进程关系详解


Posted in Python onDecember 14, 2020

关于多线程的大概讲解:

在Python的标准库中给出了2个模块:_thread和threading,_thread是低级模块不支持守护线程,当主线程退出了时,全部子线程都会被强制退出了。而threading是高级模块,用作对_thread进行了封装支持守护线程。在大部分状况下人们只需要采用threading这个高级模块即可。

关于多进程的大概讲解:

多进程是multiprocessing模块给出远程与本地的并发,在一个multiprocessing库的采用场景下,全部的子进程全是由一个父进程运行来的,这个父进程变成madter进程,它会管理一系列的对象状态下,如果一旦这个进程退出了,子进程很可能处在一个不稳定的状态下,那么这个父进程尽量要少做事来维持其稳定性

所以python多线程和多进程的区别如下:

多线程中,全部子线程的进程号一样;多进程中,不一样的子进程进程号不一样

线程共享内存空间;进程的内存是独立的

多线程可以共享全局变量,多进程做不到

同一个进程的线程之间可以直接交流;2个进程想通信,必须通过一个中间代理来实现

一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程

创建新线程很简单;创建新进程需要对其父进程进行一次克隆

内容扩展:

python多进程、多线程之联系与区别

进程

概念:进程是操作系统分配资源的最小单元

理解:一个应用程序至少包括1个进程,每个进程在执行过程中拥有独立的内存单元,python的多进程编程主要依靠multiprocess模块。

进程间通信:首先,进程间是可以相互通信的,比较常见的有七种通信方式,如管道pipe、命名管道FIFO、消息队列MessageQueue、共享内存SharedMemory、信号量Semaphore、套接字Socket、信号 signal(由于实际开发涉及较少,这里只作简单介绍)但是通常进程之间是相互独立的,每个进程都有独立的内存。通过共享内存(nmap模块),进程之间可以共享对象,使多个进程可以访问同一个变量(地址相同,变量名可能不同)。多进程共享资源必然会导致进程间相互竞争,所以应该尽最大可能防止使用共享状态。

线程

概念:线程是操作系统调度的最小单元

理解:1个进程包括1个或多个线程,相比较之下,线程占用资源更少,更高效,且一个进程的多个线程在执行过程中共享内存,毫无疑问,线程之间可以相互通信。而python的多进程编程主要依靠threading模块

线程间通信:主要有两种方式,一种是上锁,上互斥锁确保任意时刻只有一个线程具备修改全局变量的能力。另一种则是使用消息队列,比较经典的生产者、消费者模型就是这样,一个负责生成,一个负责消费,所生成的产品存放在queue里,实现了不同线程间沟通。

多进程跟多线程的区别

由于进程的创建跟销毁都涉及到系统资源的分配以及回收,导致多进程的开销明显大于多线程的开销。

两者的应用场景

对CPU密集型代码(比如循环计算) - 多进程效率更高

对IO密集型代码(比如文件操作,网络爬虫) - 多线程效率更高

理由:对于IO密集型操作,大部分消耗时间其实是等待时间,在等待时间中CPU是不需要工作的,那你在此期间提供双CPU资源也是利用不上的,相反对于CPU密集型代码,2个CPU干活肯定比一个CPU快很多。那么为什么多线程会对IO密集型代码有用呢?这时因为python碰到等待会释放GIL供新的线程使用,实现了线程间的切换。

到此这篇关于python多线程和多进程关系详解的文章就介绍到这了,更多相关python多线程和多进程之间的联系内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中str.format()详解
Mar 12 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
python实现n个数中选出m个数的方法
Nov 13 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 Python
Python udp网络程序实现发送、接收数据功能示例
Dec 09 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
浅谈django channels 路由误导
May 28 Python
python GUI模拟实现计算器
Jun 22 Python
Python urllib3软件包的使用说明
Nov 18 Python
Python Pandas list列表数据列拆分成多行的方法实现
Dec 14 #Python
pandas将list数据拆分成行或列的实现
Dec 13 #Python
pandas按照列的值排序(某一列或者多列)
Dec 13 #Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
Dec 13 #Python
pandas抽取行列数据的几种方法
Dec 13 #Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 #Python
Pandas中两个dataframe的交集和差集的示例代码
Dec 13 #Python
You might like
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP运行时强制显示出错信息的代码
2011/04/20 PHP
yii数据库的查询方法
2015/12/28 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
JS应用之禁止抓屏、复制、打印
2008/02/21 Javascript
JS 实现双色表格实现代码
2009/11/24 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
jQuery 下拉列表 二级联动插件分享
2012/03/29 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
jquery对table中各数据的增加、保存、删除操作示例
2014/05/14 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
vuejs 单文件组件.vue 文件的使用
2017/07/28 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
jquery简易手风琴插件的封装
2020/10/13 jQuery
vant自定义二级菜单操作
2020/11/02 Javascript
解决谷歌搜索技术文章时打不开网页问题的python脚本
2013/02/10 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Sanic框架安装与简单入门示例
2018/07/16 Python
python协程gevent案例 爬取斗鱼图片过程解析
2019/08/27 Python
python 基于opencv实现高斯平滑
2020/12/18 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
美国知名保健品网站:LuckyVitamin(支持中文)
2017/08/09 全球购物
管事部库房保管员岗位职责
2014/02/21 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
《生命的药方》教学反思
2014/04/08 职场文书
初一新生军训方案
2014/05/22 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
教师理论学习心得体会
2016/01/21 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS