进击の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~~的更多相关文章

  1. [Java并发编程(四)] Java volatile 的理论实践

    [Java并发编程(四)] Java volatile 的理论实践 摘要 Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 ...

  2. 并发编程(四)TaskFuture

    并发编程(四)TaskFuture ExecutorService executorService = Executors.newSingleThreadExecutor(); Future<O ...

  3. 并发编程(四):ThreadLocal从源码分析总结到内存泄漏

    一.目录      1.ThreadLocal是什么?有什么用?      2.ThreadLocal源码简要总结?      3.ThreadLocal为什么会导致内存泄漏? 二.ThreadLoc ...

  4. 并发编程(四):atomic

    本篇博客我们主要讲述J.U.C包下的atomic包,在上篇博客"并发模拟"的最后,我们模拟高并发的情形时出现了线程安全问题,怎么解决呢?其实解决的办法有很多中,如直接在add()方 ...

  5. 聊聊高并发(十四)理解Java中的管程,条件队列,Condition以及实现一个堵塞队列

    这篇里面有一些主要的概念,理解概念是件有意义的事情,仅仅有理解概念才干在面对详细问题的时候找到正确的解决思路.先看一下管程的概念 第一次在书上看到管程这个中文名称认为非常迷糊,管程究竟是个什么东东,于 ...

  6. Java并发编程(四):线程安全性

    一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安 ...

  7. java高并发编程(四)高并发的一些容器

    摘抄自马士兵java并发视频课程: 一.需求背景: 有N张火车票,每张票都有一个编号,同时有10个窗口对外售票, 请写一个模拟程序. 分析下面的程序可能会产生哪些问题?重复销售?超量销售? /** * ...

  8. Python并行编程(十四):异步编程

    1.基本概念 除了顺序执行和并行执行的模型以外,还有异步模型,这是事件驱动模型的基础.异步活动的执行模型可以只有一个单一的主控制流,能在单核心系统和多核心系统中运行. 在并发执行的异步模型中,许多任务 ...

  9. java并发编程(四) 线程池 & 任务执行、终止源码分析

    参考文档 线程池任务执行全过程:https://blog.csdn.net/wojiaolinaaa/article/details/51345789 线程池中断:https://www.cnblog ...

  10. Java并发编程 (十) 多线程并发拓展

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.死锁 1.死锁的定义 所谓的死锁是指两个或两个以上的线程在等待执行的过程中,因为竞争资源而造成的一种 ...

随机推荐

  1. 第三方登陆--QQ登陆

    从零玩转第三方QQ登陆 在真正开始对接之前,我们先来聊一聊后台的方案设计.既然是对接第三方登录,那就免不了如何将用户信息保存.首先需要明确一点的是,用户在第三方登录成功之后, 我们能拿到的仅仅是一个代 ...

  2. MongoDB快速入门教程 (2)

    2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...

  3. vue全家桶(4.3)

    5.3.Vuex的核心概念 store: 每一个 Vuex 应用的核心就是 store(仓库)."store"基本上就是一个容器,它包含着你的应用中大部分的状态 (state) s ...

  4. ftp的passive模式

    ftp的passive模式 今天在一台测试服务器上搭建ftp,折腾了许久. 主要是不了解ftp的passive模式和port模式的区别.这里记录一下. 和passive模式对应的叫做port模式,也叫 ...

  5. 全栈的自我修养: 001环境搭建 (使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发)

    全栈的自我修养: 环境搭建 Not all those who wander are lost. 彷徨者并非都迷失方向. Table of Contents @ 目录 前言 环境准备 nodejs v ...

  6. 【草稿】自定义ASP.NET MVC Html辅助方法

    https://www.cnblogs.com/myshell/archive/2010/05/09/1731269.html 在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其 ...

  7. 关于数据文件的文件头2-P2

    文章目录 1 疑问点 2 实验验证 2.1 实验环境 2.2 创建统一区大小管理表空间 2.2.1 统一区大小40k 2.2.2 统一区大小56k 2.2.3 统一区大小64k 2.2.4 统一区大小 ...

  8. 理解css中Grid布局,在项目中如何实现grid页面布局

    简介 CSS中Grid是一种二维网格式布局方式.我们常规使用table.float.position.inline-block等布局,但它们遗漏了很多功能,例如垂直居中.后来css3中flexbox的 ...

  9. Form表单,textarea标签输入框 字数限制,和已输入字数的统计显示

    <script type="text/javascript"> $(document).ready(function() { <%-- 页面进来时就调用 --%& ...

  10. STL测试3)优先级队列实现二叉堆

    用法: big_heap.empty();判断堆是否为空 big_heap.pop();弹出栈顶元素最大值 big_heap.push(x);将x添加到最大堆 big_heap.top();返回栈顶元 ...