python 并发编程 多线程 线程queue
线程queue
线程之间已经是共享数据的,为什么还使用线程queue?
线程需要自己加锁,线程queue帮我们处理好加锁的问题
有三种不同的用法
第一种方法:
class queue.Queue(maxsize=0) #队列:先进先出
put('four',block=,timeout=)
第一个参数: 放入的数据
第二个参数:
block=True 时 队列满了,再放数据不抛出异常,程序卡主,不指定block参数,默认是True
block=false时,队列满了,再放数据,不阻塞,抛出异常
源码
def put(self, item, block=True, timeout=None):
第三个参数 timeout:
设置队列满后,再放数据发生的阻塞时间,如果过了这个时间,还没有取数据,队列还是满的,就抛出异常,就算block=True也抛出异常
put()
设置只能放3个数据,队列满,再去放第四个数据,程序卡主 阻塞了
默认block参数为True
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") q.put("four")
block=False时候,队列满了,再放数据,不阻塞,抛出异常
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") q.put("four",block=False) '''
q.put("four",block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 130, in put
raise Full
queue.Full
'''
timeout
设置队列满后,再放数据发生的阻塞时间,如果过了这个时间,还没有取数据,队列还是满的,就抛出异常,就算block=True也抛出异常
阻塞3秒,3秒后,队列还满,抛出异常
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") q.put("four",block=True, timeout=3) '''
q.put("four",block=True, timeout=3)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 141, in put
raise Full
queue.Full
'''
q.put_nowait('four') == q.put('four', block=False)
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") q.put_nowait('four') '''
q.put_nowait('four')
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 184, in put_nowait
return self.put(item, block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 130, in put
raise Full
queue.Full
'''
取数据 get()
和put一样
put(block=,timeout=)
第一个参数:
block=True 时 队列取空了数据,再取数据不抛出异常,程序卡主,不指定block参数,默认是True
block=false时,队列取空数据,再取数据,不阻塞,抛出异常
第二个参数
timeout:
设置队列取空数据,再取数据后的阻塞时间,如果过了这个时间,还没有放数据,队列还是空的,就抛出异常,就算block=True也抛出异常
源码
def get(self, block=True, timeout=None):
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get()) '''
first
second
third
'''
队列取完后,再去取数据,程序卡主,阻塞了
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print(q.get())
block=False时,队列取完后,再去取数据,抛出异常
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print((q.get(block=False))) '''
print((q.get(block=False)))
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 161, in get
raise Empty
queue.Empty
'''
q.get_nowait() == q.get(block=False) 一样
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print(q.get_nowait()) # == q.get(block=False) '''
print(q.get_nowait()) # == q.get(block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 192, in get_nowait
return self.get(block=False)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\queue.py", line 161, in get
raise Empty
queue.Empty
'''
timeout:
设置队列取空数据,再取数据后的阻塞时间,如果过了这个时间,还没有放数据,队列还是空的,就抛出异常,就算block=True也抛出异常
import queue q = queue.Queue(3) # 先进先出 --> 队列 q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get())
print((q.get(block=True, timeout=3)))
第二种方法:
class queue.LifoQueue(maxsize=0) #堆栈:后进先出
用法和Queue类一样
import queue q = queue.LifoQueue(3) # 堆栈:后进先出 q.put("first")
q.put("second")
q.put("third") # 取数据
print(q.get())
print(q.get())
print(q.get()) '''
third
second
first
'''
第三种方法
class queue.PriorityQueue(maxsize=0) #优先级队列:存储数据时可设置优先级的队列
put进入一个元组,元组的第一个元素是优先级
(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
第二个元素是放入的数据,可以是列表,字符串,字典等
import queue q = queue.PriorityQueue(3) # 堆栈:后进先出 '''
put进入一个元组,元组的第一个元素是优先级
(通常是数字,也可以是非数字之间的比较),数字越小优先级越高
''' q.put((40,"first"))
q.put((10,"second"))
q.put((30,"third")) # 取数据
print(q.get())
print(q.get())
print(q.get()) '''
结果(数字越小优先级越高,优先级高的优先出队):
(10, 'second')
(30, 'third')
(40, 'first')
'''
结果 数字越小优先级越高,优先级高的优先出队
python 并发编程 多线程 线程queue的更多相关文章
- 并发编程~~~多线程~~~线程queue, 事件event,
一 线程queue 多线程抢占资源,只能让其串行. 互斥锁 队列 import queue q = queue.Queue() # 先进先出 q = queue.LifoQueue() # 先进后出 ...
- python 并发编程 多线程 线程理论
操作系统比作一家公司,进程相当于一个部门 线程相当于一个部门的成员 进程之间是互相隔离的 一 什么是线程 1. 每启动一个进程 至少有一个线程, 在传统操作系统中,每个进程有一个地址空间,而且默认 ...
- python 并发编程 多线程 目录
线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- python并发编程&多线程(二)
前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...
- python并发编程之线程/协程
python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...
- python并发编程&多线程(一)
本篇理论居多,实际操作见: python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...
- Python并发编程——多线程与协程
Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...
- python并发编程——多线程
编程的乐趣在于让程序越来越快,这里将给大家介绍一个种加快程序运行的的编程方式--多线程 1 著名的全局解释锁(GIL) 说起python并发编程,就不得不说著名的全局解释锁(GIL)了.有兴趣的同 ...
随机推荐
- 43 java中的异常处理机制的简单原理和应用
- Vue中如何使用axios请求跨域数据
1.axios不支持jsonp,因为axios的作者觉得jsonp不太友好,推荐用CORS方式更为干净: 2.在使用axios发送请求时,服务器端设置 res.header("Access- ...
- [人物存档]【AI少女】【捏脸数据】写实系列
点击下载:AISChaF_20191023202713797.zip 点击下载:AISChaF_20191023202713797.zip
- JavaScript 数组1—索引数组
索引数组:下标是数字数组 ㈠什么是? 内存中连续储存多个数据的数据结构,再起一个统一的名字 ㈡为什么? ①普通的变量只能存储一个数据程序=数据结构+算法 ②算法:解决问题的步骤 ③数据结构:数据在内存 ...
- hdu_3535 (AreYouBusy)
http://acm.hdu.edu.cn/showproblem.php?pid=3535 题意: 给你n个工作集合,给你T的时间去做它们.给你m和s,说明这个工作集合有m件事可以做, ...
- scrapy项目5:爬取ajax形式加载的数据,并用ImagePipeline保存图片
1.目标分析: 我们想要获取的数据为如下图: 1).每本书的名称 2).每本书的价格 3).每本书的简介 2.网页分析: 网站url:http://e.dangdang.com/list-WY1-dd ...
- unittest详解(四) 批量执行用例(discover)
前面我们说了,对于不同文件用例,我们可以通过addTest()把用例加载到一个测试套件(TestSuite)来统一执行,对于少量的文件这样做没问题,但是如果有几十上百个用例文件,这样做就太浪费时间了. ...
- What’s up with the Graph Laplacian
What's up with the Graph Laplacian? 来源 作者:Jeremy Kun blog: Math ∩ Programming 在数学上图和与图关联的某些矩阵的代数性质有很 ...
- webdriver驱动火狐浏览器报错:Unable to find a matching set of capabilities
raise exception_class(message, screen, stacktrace)selenium.common.exceptions.SessionNotCreatedExcept ...
- ES6的对象属性简写
在ES6中允许我们在设置一个对象的属性的时候不指定属性名. 不使用ES6: const name='Ming', age='18', city='Shanghai'; const student ={ ...