~~并发编程(十四):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.死锁的定义 所谓的死锁是指两个或两个以上的线程在等待执行的过程中,因为竞争资源而造成的一种 ...
随机推荐
- Git【入门】这一篇就够了
前言 欢迎关注公众号,白嫖原创PDF,也可以催更,微信搜:JavaPub,回复:[666] Git 在生产工作中是使用频率很高的工具,但我发现很多文章只是对它做了简单的提交命令说明,真正遇到 版本冲突 ...
- ajax前后端交互原理(4)
4.JSON 4.1 什么是JSON? JavaScript 对象表示法(JavaScript Object Notation)简称JSON,是一种轻量级的数据交换格式.虽然它基于JavaScript ...
- sql server 分组查询结合日期模糊查询
分组查询: https://www.cnblogs.com/netserver/p/4518995.html 日期格式化格式: http://blog.csdn.net/qq_16769857/art ...
- jQurey zTree API 3.5
https://jeesite.gitee.io/front/jquery-ztree/3.5/api/API_cn.html
- js实现简单的菜谱全选功能
思路:全选按钮和子按钮分开考虑,当全选按钮选中的时候,也就是其checked为true的时候,所有的子按钮也全都为true,反之,则为false.子按钮的想法是,当点击某一个子按钮的时候,会看一下是否 ...
- CentOS 关闭暂不需要的系统服务
需要保留的服务:crond.iptables.irqbalance.microcode_ctl.network.random.sshd.syslog.local 一 .使用命令:ntsysv 打开选项 ...
- Spring笔记(3) - debug源码AOP原理解析
案例 @EnableAspectJAutoProxy//开启基于注解的aop模式 @Configuration public class AOPConfig { //业务逻辑类加入容器中 @Bean ...
- java语言基础(七)_继承_super_this_抽象类
继承 1. 继承概述 2. 继承格式 在继承的关系中,"子类就是一个父类".也就是说,子类可以被当做父类看待. 例如父类是员工,子类是讲师,那么"讲师就是一个员工&quo ...
- 如何使用JS操纵伪元素
css引入伪类和伪元素概念是为了格式化文档树以外的信息.也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或者是列表中的第一个元素. 伪类 用于当已有元素处于的某个状态时 ...
- CD题解(药水的选择)
这道题显然是一个01背包加上记录路径的题目,要说这道题的原型就是N多年前的CD 本题主要考的就是对01背包的基础板子加上稍微一点点的码力,就可以A掉这个题了 废话不多说,上代码: #include&l ...