线程、进程和协成对比
讲述线程、进程和协成?
1)为什么引入:
操作系统可以同时运行多个任务,引入了线程,进程和协成
2)定义:
线程: 可以理解成执行代码的分支,线程是执行对应的代码的,cpu会调度对应的线程去工作,也可以说线程是cpu调度的基本单位(工作原理)
进程: 通俗理解一个运行起来的程序或者软件叫做进程
如何理解进程:把进程想成现实生活中的公司,公司可以给员工提供办公资源(办公桌椅,办公电脑等资源), 真正干活的是员工,所以员工可以想成线程,公司就是进程
协成:又称为微线程,也称为用户级线程,在不开辟线程的基础上完成多任务,在def里面只看到一个yield关键字可以理解程是协程(理解), 在单线程的基础上可以完成多任务,多个任务按照一定顺序交替执行(目的)
3)使用:
进程、线程和协成的使用对比
2.1 线程是cpu调度的基本单位,通过线程去执行进程中代码, 线程是执行代码的分支
2.2 进程是操作系统资源分配的基本单位,每启动一个进程都需要向操作系统索要运行资源,默认一个进程只有一个线程,线程是依附在进程里面的
2.3 多进程开发比单进程多线程开发稳定性要强,但是多进程开发比多线程开发资源开销要大
2.4 多进程开发某个进程死了不会影响其它进程的运行,但是多线程开发该进程死了那么这些线程都要进行销毁
2.5 进程之间不共享全局变量,线程之间共享全局变量,但是线程要注意资源竞争的问题
线程之间共享全局变量:
同步就是协同步调,按预定的先后次序进行运行线程同步可以解决共享全局变量的问题
从而引入了互斥锁,互斥锁确保了某段关键代码只能由一个线程从头到尾完整地执行,在使用过程中要避免出现死锁
进程之间不共享全局变量:
多进程之间不共享全局变量,为了进程间的通讯,引入Queue这个类
2.6 先有进程,然后进程可以创建线程,线程是依附在进程里面的,线程里面可以包含多个协程
2.7 多线程开发线程之间执行是无序的,协程之间执行按照一定顺序交替执行
2.8 协程以后主要用在网络爬虫和网络请求,开辟一个协程大概需要5k空间,开辟一个线程需要512k空间, 开辟一个进程占用资源最多
附录:
对于线程的使用:
1.线程之间执行是无序(对比中已包含)
2.主线程会等待所有的子线程执行完成以后程序再退出,daemon=True 表示守护主线程,主线程退出子线程直接销毁不再执行对应的代码
3.多线程共享全局变量(对比中已包含)
4.互斥锁: 能保证同一时刻只有一个线程去执行代码,具体那个线程抢到锁我们决定不了,但是加上互斥锁多任务瞬间变成单任务变成单任务性能会下降(对比中已包含)
5.死锁:一直等待对方释放锁的情景就叫做死锁,工作中避免死锁的出现,要在适当的地方释放锁(对比中已包含)
对于进程的使用:
1.多进程之间不共享全局变量,为了进程间的通讯,引入Queue这个类(对比中已包含)
2.向队列里面放入数据统一put方法,获取数据的使用同一使用get方法
3.主进程会等待所有的子进程执行完成以后程序再退出,设置守护主进程,主进程退出后子进程直接销毁 sub_process.daemon = True
主进程退出之前先让子进程直接销毁,然后主进程就可以退出了:sub_process.terminate()
通过进程池完成对应的任务
同步执行:一个任务执行完成另外一个任务才能执行 pool.apply(copy_work) 资源竞争时使用
使用异步方式用进程池执行对应的任务:pool.apply_async(copy_work)
5.创建进程池中的queue时,使用异步执行对应的任务,执行异步任务会返回一个应用结果对象,这个对象里面有一个wait()方法可以等待异步任务执行完成以后代码再继续往下执行
对于协成的使用:
gevent封装是greenlet,可以根据耗时操作自动完成协程之间的切换执行
打补丁,让gevent框架识别耗时操作,比如:time.sleep,网络请求延时,monkey.patch_all()
创建协程指定对应的任务
*args: 以位置方式传参
**kwargs: 以关键字方式传参
g1 = gevent.spawn(download_img, img_url1, “1.jpg”)
主线程等待所有的协程执行完成以后程序再退出
gevent.joinall([g1, g2, g3])
更多见:https://blog.csdn.net/sinat_41912529/article/details/80306582
转载于:https://www.cnblogs.com/Dark-fire-liehuo/p/10061721.html
线程、进程和协成对比相关推荐
- python协程和线程_python之并发编程(线程\进程\协程)
一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...
- python apply_async死锁_python之并发编程(线程\进程\协程)
一.进程和线程 1.进程假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是不 ...
- 十四丶并发编程(线程 进程 协程)
Yuan先生 知识预览 操作系统 回到顶部 操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入输出设备组成的复杂系 ...
- python的线程如何启用和结束_python线程进程
操作系统 一 为什么要有操作系统? 现代计算机系统是由一个或者多个处理器,主存,磁盘,打印机,键盘,鼠标显示器,网络接口以及各种其他输入 输出设备组成的复杂系统,每位程序员不可能掌握所有系统实现的细节 ...
- python提高——进程、线程、协程对比及代码实现
目录 1多任务 1.1并发 1.2并行 2线程 2.1引入线程 2.2线程进行顺序 2.3线程封装 2.4多线程-共享全局变量 2.5资源竞争 2.6互斥锁 2.7死锁 3进程 3.1进程创建 3.2 ...
- 进程、线程、协程对比
进程.线程对比 功能 进程,能够完成多任务,比如 在一台电脑上能够同时运行多个QQ 线程,能够完成多任务,比如 一个QQ中的多个聊天窗口 定义的不同 进程是系统进行资源分配和调度的一个独立单位. 线程 ...
- 进程线程协程对比(通俗)
以下的总结是我在学习网课时,总结的老师的学习笔记. 可惜不知道这个老师是谁,只想说这个老师讲的特别好! 进程.线程.协程 对比 请仔细理解如下的通俗描述 有一个老板想要开一个工厂进行生产某件商品(例如 ...
- Python进程、线程、协成
什么是线程? 程序执行的最小单位 线程是进程中的一个实体,是被系统独立调度和分派的基本单位 线程的创建 threading.Thread(target = 变量名) 线程的资源竞争问题 线程是可以资源 ...
- python线程池模块_python并发编程之进程池,线程池,协程
需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...
- 线程 、进程、协程 三者区别
从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务. 一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都是一种CPU的执行单元. 进程:表示一个程序的上下文 ...
最新文章
- Express应用配置端口
- 【约束布局】ConstraintLayout 13 种相对定位属性组合 ( 属性组合 | 用法说明 )
- Visual Studio 2015安装教程(附激活码)
- mqtt js 中乱码_mqtt之上RRPC同步调用实战
- Windows 2008 R2安装DHCP服务器问题及解决方法
- android 事件分发
- Web开发技巧:使用自定义数据属性创建弹出窗口
- 如何自定义FusionCharts图表上的工具提示?
- 注解定时器_细数那些使用过的定时器
- 【Silverlight】Bing Maps学习系列(八):使用Bing Maps Silverlight Control加载自己部署的Google Maps...
- NAR:eggNOG 5—蛋白功能层级注释数据库
- PyQt4-入门学习(1)
- 【论文阅读】基于强化学习的网络安全防护策略
- java script是什么_Java Script的工作原理是什么?怎样用它来生成简单的
- RestTemplate源码剖析:Encode
- Fusion APP-添加检查软件更新功能
- VMI - 供应商管理库存
- 新房和二手房的优缺点
- Android MD5加密法
- opencv处理图片批量添加噪声、以及光照、黑暗处理