day34 GIL锁 线程队列 线程池
一、Gil锁(Global Interpreter Lock)
python全局解释器锁,有了这个锁的存在,python解释器在同一时间内只能让一个进程中的一个线程去执行,这样python的多线程就无法利用多核优势,但是这并不是python语言本身的缺点,是解释器的缺点,这个问题只存在于Cpython解释其中,像Jpython就没有。但是Cpthon是python官方解释器(算目前运行效率最高的吧),所以多数人都以为Gil锁是python语言的弊端。
#GIL锁图解

过程解释:
1、加载python解释器代码
2、加载自己的py文件
3、py文件作为参数传给解释器(因为有GIL锁,一次只能一个线程进入)
4、解释器将py文件编译成.pyc字节码文件
5、解释器通过虚拟机将字节码文件转为二进制文件
6、二进制文件等待cpu调用
二、线程队列
import queue
线程队列有三种形式
1、先进先出
q = queue.Queue(3) 创建一个长度为3的队列,先进先出
q.put()
q.get()
q.size() #当前队列中有多少个元素
2、后进先出
q = queue.LifoQueue(3) 创建一个长度为3的后进先出队列
3、优先级队列
q = queue.PriorityQueue(3) 创建一个长度为3的优先级队列
import queue
# q = queue.Queue()
# q =queue.LifoQueue()
q = queue.PriorityQueue() #优先级队列
# put里是一个元组,元组的一个元素代表优先级(通常是数字,也可以是非数字,数字越小,优先级越高),第二个元素是存入队列中的值
#一个队列中,优先级必须是同一种数据类型,才能比较,否则会报错
# 如果优先级相同,那么按照后面值的ASCII码的顺序来排序
#优先级相同的数据,他们后面的值必须是相同的数据类型才能比较,但优先级相同的两个字典无法比较 # q.put((-1,'ca')) #优先级相同的两个字符串,逐个比较ASCII码值
# q.put((-1,'cb')) # q.put(("a","d")) #优先级为非数值类型
# q.put(('b',"c")) # q.put((1,{1:'hh',2:'ss'})) #优先级相同的两个字典,无法比较,报错
# q.put((1,{3:'dd',4:'jj'})) q.put((2,(4,5))) #优先级相同的元组,逐个比较元组元素值
q.put((2,(4,4))) print(q.get())
print(q.get())
优先级队列详解
三、concurrent.futures模块
通过这个模块可以创建和使用线程池和进程池
格式
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
t = ThreadPoolExecutor(max_workers=4) #创建一个线程池对象,容量为4
方法:
t.submit(fun,*args,*kwargs) #异步提交任务
res= t.submit(fun,*args,*kwargs) #返回值是一个对象
res.result() #从对象中取值,会等待任务的执行结果,等不到是阻塞
t.shutdown) #等待已提交任务完成,相当于close()和join()的效果
t.map(fun, iter) #异步提交任务
res = t.map(fun, iter) #返回结果是一个生成器对象
for el in res: #取值
print(el)
add_done_callback(fun2) #添加回调函数
t.submit(fun1,参数).add_don_callback(fun2) #调用回调函数语法
day34 GIL锁 线程队列 线程池的更多相关文章
- python并发编程之线程剩余内容(线程队列,线程池)及协程
1. 线程的其他方法 import threading import time from threading import Thread,current_thread def f1(n): time. ...
- day33 GIL锁 线程队列 线程池
1. 全局解释器锁GIL Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行.虽然 Python 解释器中可 ...
- Python 线程----线程方法,线程事件,线程队列,线程池,GIL锁,协程,Greenlet
主要内容: 线程的一些其他方法 线程事件 线程队列 线程池 GIL锁 协程 Greenlet Gevent 一. 线程(threading)的一些其他方法 from threading import ...
- GIL锁和进程/线程池
GIL锁 1.GIL锁 全局解释器锁,就是一个把互斥锁,将并发变成串行,同一时刻只能有一个线程使用共享资源,牺牲效率,保证数据安全,也让程序员避免自己一个个加锁,减轻开发负担 带来的问题 感觉单核处理 ...
- python全栈开发 * 线程队列 线程池 协程 * 180731
一.线程队列 队列:1.Queue 先进先出 自带锁 数据安全 from queue import Queue from multiprocessing import Queue (IPC队列)2.L ...
- day 34 线程队列 线程池 协程 Greenlet \Gevent 模块
1 线程的其他方法 threading.current_thread().getName() 查询当前线程对象的名字 threading.current_thread().ident ...
- day35:线程队列&进程池和线程池&回调函数&协程
目录 1.线程队列 2.进程池和线程池 3.回调函数 4.协程:线程的具体实现 5.利用协程爬取数据 线程队列 1.线程队列的基本方法 put 存 get 取 put_nowait 存,超出了队列长度 ...
- Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块
进程同步锁: 当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢? 其实也就是相当于让进程独享资源. fro ...
- GIL全局解释器锁、死锁、递归锁、线程队列
目录 GIL全局解释锁 多线程的作用 测试计算密集型 IO密集型 死锁现象 递归锁 信号量(了解) 线程队列 GIL全局解释锁 GIL本质上是一个互斥锁. GIL是为了阻止同一个进程内多个进程同时执行 ...
随机推荐
- UIWebView 缓存
//存储cookie的方法 - (void)saveCookies { // 创建一个可变字典存放cookie NSMutableDictionary *fromappDict = [NSMutabl ...
- Linux服务器可以进百度,但是进阿里云或者别的一些网站提示‘错误代码:NS_ERROR_NET_INADEQUATE_SECURITY’的问题
昨天遇到一个头疼的事情,在阿里云买了一台服务器: 然后环境各种都装了,因为本人是小白,所以一般都装MATE界面: 一开始环境没配好,访问百度可以进去,进万网但是进不去,先也没急着搞这个事情,第一天晚上 ...
- C# xml数组的序列和反序列化
先来看xml <?xml version="1.0"?> <root xmlns:xsi="http://www.w3.org/2001/XMLSche ...
- 栈ADT
栈 栈是限制插入和删除只能在同一位置的表,这一位置称为栈顶(top),也可能称为LIFO表 对于空栈的pop(弹栈)操作是一个ADT错误,但是若是push(压栈)时空间超限并不是ADT错误 实现:基于 ...
- word之高级
1.更正拼写和语法错误. 2.取消自动编号. 3.添加删除水印. 4.段落设置首行缩进2个字符. 需要先选中需要设置的段落 5.文字覆盖. insert键切换插入与改写功能.修改word状态栏上的改写 ...
- AWS是怎么改写 MySQL的?
五倍吞吐量的提升,跨可用区的六副本,低于一分钟的宕机恢复,兼容 MySQL协议,这是 AWS 推出 Aurora 数据库时给出的数据. 这种量级的提升不可能是小修小补,大都是在架构上有了变革性的突破才 ...
- linux下安装svn服务器
http://www.cnblogs.com/zhoulf/archive/2013/02/02/2889949.html 安装说明系统环境:CentOS-6.3安装方式:yum install (源 ...
- [macOS] Error: /usr/local must be writable!" (Sierra 10.12 )
Error: /usr/local must be writable!" (Sierra 10.12 ) solution: sudo chown -R $(whoami) /usr/loc ...
- Delphi中有关窗口绘制
Invalidate方法通知Windows应该重新绘制表单的整个表面.最重要的是Invalidate不会立即强制执行绘制操作. Windows只是存储请求,并且只会响应它当前程序完全执行后,并且只要系 ...
- [openjudge-搜索]城堡问题(The Castle)
题目描述 描述 图1是一个城堡的地形图.请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大.城堡被分割成mn(m≤50,n≤50)个方块,每个方块可以有0~4面墙. 输入 程序从标准输入设备 ...