~~并发编程(十四):Queue~~
进击のpython
*****
并发编程——Queue
进程其实就提过这个Queue的问题,我们为什么在进程使用Queue?
是因为当时我们想要对共享数据进行修改,同时也希望它能够自动的给我加个锁
基于上面的需求Queue就应运而生,扛起了这杆大旗
那反观线程这里,数据是共享的,那为什么还要使用Queue呢?
其实线程用Queue也是看上了他能够自己加锁的这个能力,防止自己加锁,出现死锁
单拿出来不是为了划水,而是因为Queue还有一些其他的方法没有介绍到
所以准备重新的再仔细地最后介绍一遍
队列
队列就像是商场里面的自动扶梯,先上扶梯的,也是第一个下去的
所以队列遵循着“先进先出”原则,即:FIFO
import queue
q = queue.Queue()
q.put('first')
q.put('second')
q.put('third')
print(q.get())
print(q.get())
print(q.get())
输出结果:
first
second
third
其中如果q = queue.Queue()
中括号内填有数字,代表着管道的容积可以最多容纳的单元
如果是这样q = queue.Queue(3)
,就说明管道中最多容纳三个单位
当我put四次,由于没有从管道中取值,就会引发阻塞
相对应的,如果我get了四次,由于值都已经取完 ,所以也会发生阻塞
其实阻塞是因为Queue中有个默认参数block=True
他的意思就是是否发生阻塞,如果改成False,当‘放多了’或者‘拿多了’,就会报错
里面还有一个默认参数timeout=None
是多长时间改变block的状态
q.get(block = True, timeout = 1)
比如此时这个get是第四次get,那就是,现在是阻塞状态,如果1s之内没有值让我get我就报错
堆栈
queue.LifoQueue 堆栈遵循“后进先出”
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
有一句话说得好,队列是“吃了拉”,堆栈是“吃了吐”
优先级队列
queue.PriorityQueue 根据优先级决定
import queue
q=queue.PriorityQueue()
q.put((20,'a'))
q.put((10,'b'))
q.put((30,'c'))
print(q.get())
print(q.get())
print(q.get())
put放进去一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较)
数字越小优先级越高!
执行结果如下:
(10, 'b')
(20, 'a')
(30, 'c')
*****
*****
~~并发编程(十四):Queue~~的更多相关文章
- [Java并发编程(四)] Java volatile 的理论实践
[Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...
- 并发编程(四)TaskFuture
并发编程(四)TaskFuture ExecutorService executorService = Executors.newSingleThreadExecutor(); Future<O ...
- 并发编程(四):ThreadLocal从源码分析总结到内存泄漏
一.目录 1.ThreadLocal是什么?有什么用? 2.ThreadLocal源码简要总结? 3.ThreadLocal为什么会导致内存泄漏? 二.ThreadLoc ...
- 并发编程(四):atomic
本篇博客我们主要讲述J.U.C包下的atomic包,在上篇博客"并发模拟"的最后,我们模拟高并发的情形时出现了线程安全问题,怎么解决呢?其实解决的办法有很多中,如直接在add()方 ...
- 聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个堵塞队列
这篇里面有一些主要的概念,理解概念是件有意义的事情,仅仅有理解概念才干在面对详细问题的时候找到正确的解决思路.先看一下管程的概念 第一次在书上看到管程这个中文名称认为非常迷糊,管程究竟是个什么东东,于 ...
- Java并发编程(四):线程安全性
一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安 ...
- java高并发编程(四)高并发的一些容器
摘抄自马士兵java并发视频课程: 一.需求背景: 有N张火车票,每张票都有一个编号,同时有10个窗口对外售票, 请写一个模拟程序. 分析下面的程序可能会产生哪些问题?重复销售?超量销售? /** * ...
- Python并行编程(十四):异步编程
1.基本概念 除了顺序执行和并行执行的模型以外,还有异步模型,这是事件驱动模型的基础.异步活动的执行模型可以只有一个单一的主控制流,能在单核心系统和多核心系统中运行. 在并发执行的异步模型中,许多任务 ...
- java并发编程(四) 线程池 & 任务执行、终止源码分析
参考文档 线程池任务执行全过程:https://blog.csdn.net/wojiaolinaaa/article/details/51345789 线程池中断:https://www.cnblog ...
- Java并发编程 (十) 多线程并发拓展
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.死锁 1.死锁的定义 所谓的死锁是指两个或两个以上的线程在等待执行的过程中,因为竞争资源而造成的一种 ...
随机推荐
- linux环境搭建单机kafka
准备工作: jdk-8u191-linux-x64.rpm | zookeeper-3.4.6.tar.gz | kafka_2.11-2.2.0.tgz 对应的地址 zookeeper: ...
- 超简单集成HMS Scan Kit扫码SDK,轻松实现扫码购
前言 在前面的文章中,我们向大家介绍了HMS Scan Kit 的快速集成方法以及HMS Scan Kit和其他开源扫码工具的竞争力对比分析,如果没有看到也没关系,文章下方的往期链接中有文章入口. ...
- Java项目开启远程调试(tomcat、springboot)
当我们运行一个项目的时候,一般都是在本地进行debug.但是如果是一个分布式的微服务,这时候我们选择远程debug是我们开发的利器. 环境apache-tomcat-8.5.16 Linux 如何启用 ...
- Spring Security(三) —— 核心配置解读
摘要: 原创出处 https://www.cnkirito.moe/spring-security-3/ 「老徐」欢迎转载,保留摘要,谢谢! 3 核心配置解读 上一篇文章<Spring Secu ...
- (私人收藏)蓝色抽象科技感工作计划PPT模板
蓝色抽象科技感工作计划PPT模板 https://pan.baidu.com/s/16iFYH94dVXp_izksVMGMBg0ozp
- 性能测试之Jmeter中场景设置与启动方式
Jmeter场景设置与启动方式 性能测试场景是用来模拟模拟真实用户操作的工作单元,所以场景设计一定要切合用户的操作逻辑,jmeter主要是通过线程组配合其他组件来一起完成场景的设置. 线程组设置 Jm ...
- 相邻元素之间的margin合并问题
任何元素都可以设置border 设置宽高可能无效 行内元素设置padding,margin上下是无效的,左右是有效的 外边距合并:指的是,当两个垂直外边距相遇时,它们将形成一个外边距. 合并后的外边距 ...
- day53 html收尾
目录 一.解决浮动带来的影响 二.溢出属性 三.定位 四.验证浮动和定位是否脱离文档流 五.z-index模态框 六.透明度opacity 七.js简介 一.解决浮动带来的影响 块级标签内的浮动如果该 ...
- SQL注入原理及代码分析(二)
前言 上一篇文章中,对union注入.报错注入.布尔盲注等进行了分析,接下来这篇文章,会对堆叠注入.宽字节注入.cookie注入等进行分析.第一篇文章地址:SQL注入原理及代码分析(一) 如果想要了解 ...
- iview国际化问题(iview官方提供的兼容vue-i18n@6.x+使用组件报错)
问题描述: 按照iview官方的说法配置i18n发现在使用组件的时候会报错. 兼容 vue-i18n@6.x+的配置如下图 报错如下图 解决方法: 经过参考element-ui的国际化配置终于解决问题 ...