【Python爬虫学习笔记11】Queue线程安全队列和GIL全局解释器锁
Queue线程安全队列
在Python多线程编程中,虽然threading模块为我们提供了Lock类和Condition类借助锁机制来处理线程并发执行,但在实际开发中使用加锁和释放锁仍是一个经常性的且较为繁琐的过程。因此,Python中又为我们提供了一个使用起来更为简单的模块——queue模块。
queue模块是一个线程安全的模块(线程安全——即不存在共享变量访问冲突问题),该模块提供了同步的、线程安全的队列类,包括FIFO(先进先出)队列Queue以及LIFO(后进先出)队列LifoQueue。这些队列都已经实现了锁的原子操作(即要么不做,要么都做完),可以方便地在多线程中直接使用,实现线程间的同步。
其相关函数如下:
1.Queue(maxsize)/LifoQueue(maxsize):创建并初始化一个大小为maxsize的先进先出/后进先出的队列。
2.qsize():返回队列当前以存放数据的大小。
3.empty():判断队列是否为空。
4.full():判断队列是否满了。
5.get():从队列中取一个队首数据。
6.put(data):将一个数据放到队列中。
具体的使用示例如下:
##queue模块的简单使用示例 from queue import Queue# 初始化队列 q = Queue(7)# 判断队列是否为空 print(q.empty()) #True# 存放数据 for i in range(5):q.put(i)# 输出当前队列大小 print(q.qsize()) #5# 判断队列是否为满 print(q.full()) #False# 依次取出队列元素并以列表形式输出 print([q.get() for x in range(q.qsize())]) #[0,1,2,3,4] print(q.empty()) #True
其实在get()方法中,还可以设置一个参数block,其代表当队列中没有数据时应采取的操作,默认值为True表示持续等待,如果设置为Flase则当没有数据时抛出Empty异常。
## 设置get()方法参数block from queue import Queue,Emptyq = Queue(3) for i in range(2):q.put(i)elements = [q.get() for x in range(q.qsize())]try:x = q.get(block=False) except Empty:print('The queue is empty.') """ Output:The queue is empty. """
GIL全局解释器锁
首先,我们先来了解一下Python自带的解释器——CPython
。CPython
解释器是基于C语言编写的解释器,其的多线程机制并不是一个正真的多线程,在多核CPU中,Cpython只能利用一核而不能利用多核,即同一时刻只有一个线程在执行,而表现出多线程是因为一个CPU可以在极短的时间内轮转执行每一个线程。
为了保证同一时刻只有一个线程在执行,在CPython
解释器中有一个叫做全局解释器锁GIL(Global Intepreter Lock)
的东西,其主要是用于解决CPython
解释器内存管理非线程安全的问题。
而除了CPython
解释器外,还有如下其他的解释器:
1.Jython:基于Java实现的Python解释器,不存在GIL锁。维基百科:https://en.wikipedia.org/wiki/Jython
2.IronPython:基于.net实现的Python解释器,不存在GIL锁。维基百科:https://en.wikipedia.org/wiki/IronPython
3.PyPy:基于Python实现的Python解释器,存在GIL锁。维基百科:https://en.wikipedia.org/wiki/PyPy
GIL虽然是真正意义上的多线程,但在处理一些IO操作(如文件读写和网络请求等)时还是可以提高很多效率的,因此在IO操作上更建议使用多线程机制;然而在一些CPU计算操作上用多线程并发可能反而会使效率低下,因此在这种情况下更建议使用多进程处理。
转载于:https://www.cnblogs.com/Unikfox/p/9708155.html
【Python爬虫学习笔记11】Queue线程安全队列和GIL全局解释器锁相关推荐
- Python爬虫学习笔记 -- 爬取糗事百科
Python爬虫学习笔记 -- 爬取糗事百科 代码存放地址: https://github.com/xyls2011/python/tree/master/qiushibaike 爬取网址:https ...
- python爬虫学习笔记 3.9 (了解参考:训练Tesseract)
python爬虫学习笔记 3.9 (了解参考:训练Tesseract) 参考阅读:训练Tesseract 要使用 Tesseract 的功能,比如后面的示例中训练程序识别字母,要先在系统中设置一 个新 ...
- python爬虫学习笔记3.2-urllib和request练习
python爬虫学习笔记3.2-urllib和request练习 一.urllib练习 1.百度贴吧案例 需求 分析 手动测试查询流程 观察页面 分析特殊部分 https://tieba.baidu. ...
- python爬虫学习笔记 1.9 (Handler处理器 和 自定义Opener)
python爬虫学习笔记 1.1(通用爬虫和聚焦爬虫) python爬虫学习笔记 1.2 ( HTTP和HTTPS ) python爬虫学习笔记 1.3 str和bytes的区别 python爬虫学习 ...
- python解释器的工作原理_Python GIL全局解释器锁详解(深度剖析)
通过前面的学习,我们了解了 Pyton 并发编程的特性以及什么是多线程编程.其实除此之外,Python 多线程还有一个很重要的知识点,就是本节要讲的 GIL. GIL,中文译为全局解释器锁.在讲解 G ...
- Python GIL全局解释器锁
目录 GIL全局解释器锁 一.引入: 二.GIL介绍 三.GIL与Lock 四.GIL与多线程 总结 GIL全局解释器锁 一.引入: 首先要明白,GIL并不是Python的一个特性,其实在我们通常所称 ...
- Python中的GIL(全局解释器锁)
1. GIL全称Global Interpreter Lock,每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码. 2.GIL的缺点 GIL使Python不能充分利用多核心 ...
- python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁
ps:python解释器有很多种,最常见的就是C python解释器 GIL全局解释器锁: GIL本质上是一把互斥锁:将并发变成串行,牺牲效率保证了数据的安全 用来阻止同一个进程下的多个线程的同时执行 ...
- Python高级——GIL全局解释器锁问题
GIL全局解释器锁 GIL全局解释器锁是cpython解释器内部的一把锁,和python中的lock锁不是一个层面. GIL产生的背景:在cpython解释内部运行多个线程的时候,每个线程都需要解释器 ...
最新文章
- 国际色卡c色号查询_怎幺提取图片中的潘通色卡?图片找色卡
- 投资者建议三星电子一分为二 股价创历史新高
- Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题
- 120xa正反转参数_你知道变频器的“正反转死区时间”吗?它的“停机方式”有几种?...
- Linux 系统中 Redis 的安装及其使用
- sql for循环_【赵强老师】什么是PL/SQL?
- 10分钟快速配置LAMP环境
- Model与Record转换适配
- mongodb使用csv导入导出
- 计算机公式怎么计算合计,excel表格函数数据求和公式是什么-Excel中怎么用公式计算合计...
- ARM TrustZone技术简介
- Flutter系列(二)flutter项目打安装包
- 爱莫科技升级KISS人工智能算法平台,更好赋能实体零售
- 科学型IT人才和工程型IT人才
- 虚拟机KALI2022.2下安装GVM
- ReentrantLock 锁详解
- k宝无法连接计算机,农行K宝无法识别
- 58旗下转转:上半年闲置交易报告出炉
- 严重性代码说明项目文件行禁止显示状态错误LNK2019无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)“ (? invoke_main@@YAHX
- 记录第一个360浏览器翻译插件