python中socket、进程、线程、协程、池的创建方式和应用场景
一、进程线程协程的应用场景
CPU密集型
CPU密集型也叫计算密集型,计算密集型任务的特点是要进行大量的计算,消耗CPU资源,CPU占用率接近100%,比如计算圆周率。
IO密集型
IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。
对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。
IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,
进程
场景 CPU密集型 利用多核、高计算型的程序、启动数量有限
进程是计算机中最小的资源分配单位
进程和线程是包含关系 每个进程中都至少有一条线程
可以利用多核,数据隔离
创建 销毁 切换 时间开销都比较大
随着开启的数量增加 给操作系统带来负担
线程
IO密集型 调度是我们不能干预的 我们只能写我们自己的逻辑
场景 一些协程现有的模块不能完成帮助我们规避IO操作的功能 适合使用多线程 urllib
被CPU调度的最小单位,线程的切换时操作系统完成的
在cpython解释器下不能利用多核,数据共享
创建 销毁 切换 时间开销都比进程小很多
随着开启的数量增加 给操作系统带来负担
协程
IO密集型 用户可以自己控制的 我们能否抢占更多的资源完全取决于我们切换策略
场景 一些通用的场景 可以用协程现有的模块来规避一些IO操作适合使用协程
协程的切换工作是用户完成的
是一个线程,完全不能利用多核,不会产生数据不安全的现象
多个任务之间互相切换不依赖操作系统,无论开启多少个协程都不会给操作系统带来负担
即:多进程比较适用于CPU密集型的任务,线程和协程比较适用于IO密集型的任务
二、GIL锁与线程互斥锁的理解
GIL锁
GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。
某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。
拿不到通行证的线程,就不允许进入CPU执行。GIL只在cpython中才有。
即保证同一时刻只有一个线程能使用到cpu,保证多个线程在修改一个变量时不会崩溃,但结果可能是混乱的。 GIL锁的释放
在python3.x中,GIL不使用ticks计数,改为使用计时器(执行时间达到阈值后,当前线程释放GIL) 互斥锁 : 多线程时,保证修改共享数据时有序的修改,不会产生数据修改混乱。 对于GIL和线程的锁,我的理解是:
num = 100 def count():
global num
print(num)
num -= 1 # 线程的资源是共享的 # 需要注意的是,num -= 1的操作是:先读取num,然后修改num的值,最后再写回内存
当没有使用互斥锁,进程中有两个线程(t1, t2)都在执行count函数
1.t1获取到GIL锁,去执行代码,当执行到 print(num) 这里的时候,GIL执行时间达到阈值,t1释放GIL(此时num没有被修改,num=100)
2.t2竞争到了GIL锁,也去执行代码,当执行到 num -= 1 这里的时候,GIL执行时间达到阈值,t2释放GIL(假设此时num在t2这里已经被修改num=99,但是还没来得及把num更新到内存,即别的线程读取num的时候,num还是100)
3.t1再次获取到GIL锁,继续去执行刚才剩下的代码,由于内存中的num还未更新,此时t1执行 num -= 1 num还是等于100-1,然后t1把num=99更新到内存
4.t2获取到GIL锁,继续刚才的操作,把num=99更新到内存。
5.那么此时数据就混乱了,按我们的逻辑,count函数执行了两次,num应该是98,但实际等于99。 6.如果count函数在修改num的时候加了线程的互斥锁,那么即使获取到了GIL,但没有获取到线程互斥锁,仍然无法修改num
7.只有同时获取了GIL锁和互斥锁的线程才能去修改num,线程锁保证修改共享数据时有序的修改,不会产生数据修改混乱 多进程中的GIL
每个进程被fork或spawn时,其实都是开启了一个新的 python解释器进程,所以每个子进程都拥有一个独立的GIL锁。这样的话每个进程里面至少有一个住线程在跑,进程内的线程就实行GIL机制。这样就可以发挥多核优势。
python中socket、进程、线程、协程、池的创建方式和应用场景的更多相关文章
- python基础(16)-进程&线程&协程
进程之multiprocessing模块 Process(进程) Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建. 介绍 初始化参数 Process([group [, t ...
- Python 进程线程协程 GIL 闭包 与高阶函数(五)
Python 进程线程协程 GIL 闭包 与高阶函数(五) 1 GIL线程全局锁 线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的 ...
- python自动化开发学习 进程, 线程, 协程
python自动化开发学习 进程, 线程, 协程 前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型
本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...
- python并发编程之线程/协程
python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...
- 进程&线程&协程
进程 一.基本概念 进程是系统资源分配的最小单位, 程序隔离的边界系统由一个个进程(程序)组成.一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stac ...
- Python 多线程、进程、协程上手体验
浅谈 Python 多线程.进程.协程上手体验 前言:浅谈 Python 很多人都认为 Python 的多线程是垃圾(GIL 说这锅甩不掉啊~):本章节主要给你体验下 Python 的两个库 Thre ...
- python的进程/线程/协程
1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...
随机推荐
- 经典面试题:浏览器是怎样解析CSS的?
摘要: 理解浏览器原理. 解析 一旦 CSS 被浏览器下载,CSS 解析器就会被打开来处理它遇到的任何 CSS.这可以是单个文档内的 CSS.<style>标记内的 CSS,也可以是 DO ...
- js中函数表达式和自执行函数表达式的用法总结
立即调用函数表达式 给函数体加大括号,在有变量声明的情形下,没有任何区别 但是,如果只是[自动执行]的情形下,就会不同 因为,一个匿名函数,不赋值或函数体不加小括号,是不能自动执行的 //以下情形并无 ...
- 如何用ABP框架快速完成项目(面向项目交付编程面向客户编程篇)(1) - 目录
昨天发表了<如何用ABP框架快速完成项目 - 自动化测试 - 前端angular e2e protractor>后,大家十分热情,几个小时内就收到了不少问题,包括: 对于ui自动化测试这方 ...
- 2019Java查漏补缺(一)
看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...
- java中的sql语句中如果有like怎么写
我先是在SQL server中写了如下语句: 这样是顺利执行的,可是我把这句话复制到Java代码中打出来却报错了, 刚开始我还以为是前端没有传回来值,待我一句一句打印发现,它提示我rs没有next.到 ...
- Html 解决数字和字母不换行
在html页面中,如果是数字或者字母显示的话,默认是不换行的.一般显示成这种: 解决方法确实也很简单,设置td或者div为: style="word-break:break-all;&quo ...
- 爬虫系列---scrapy全栈数据爬取框架(Crawlspider)
一 简介 crawlspider 是Spider的一个子类,除了继承spider的功能特性外,还派生了自己更加强大的功能. LinkExtractors链接提取器,Rule规则解析器. 二 强大的链接 ...
- 前端——HTML
HTML HTML叫做超文本标记语言,是一种制作万维网页面标准语言.相当于定义一套规则,大家都来遵守它,这样浏览器就可以去解释它. 浏览器负责将标签翻译成用户看得懂的格式,呈现给用户. 作为开发者需要 ...
- nginx与fastdfs配置详解与坑
nginx与fastdfs配置详解与坑 环境 ubantu19.04 fastdfs-5.11 fastdfs-nginx-module-1.20 libfastcommon-1.0.39 nginx ...
- 引用传递this关键字
this关键字主要有三个应用: (1)this调用本类中的属性,也就是类中的成员变量: (2)this调用本类中的其他方法: (3)this调用本类中的其他构造方法,调用时要放在构造方法的首行.