优先级队列

Queue模块详解

浪子不回头ぞ 提交于 2020-01-26 09:50:52
Python3.5中,队列是线程间最常用的交换数据的形式。Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外。 创建一个“队列”对象 import queue q = queue.queue(maxsize = 10) queue.queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。 将一个值放入队列中 q.put(10) 调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为 1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。 将一个值从队列中取出 q.get() 调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。 Python queue模块有三种队列及构造函数: 1、Python queue模块的FIFO队列先进先出。 class queue.queue

python2.7入门---多线程

此生再无相见时 提交于 2020-01-24 07:43:21
多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理。 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。 线程可以被抢占(中断)。 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。 Python中使用线程有两种方式:函数或者用类来包装线程对象。首先是,函数式:调用thread模块中的start_new_thread()函数来产生新线程。语法如下: thread.start_new_thread ( function, args[, kwargs] )

RabbitMQ 通信过程

风格不统一 提交于 2020-01-24 04:10:09
Rabbit MQ的通信过程 MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,是消费-生产者模型的典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列中的消息,这点可以与数据结构中队列的作用相类似,具有FIFO的特点。 RabbitMQ是MQ产品的典型实现,是基于AMQP协议可复用的企业消息系统。业务上,可以实现服务提供者和消费者之间的数据解耦,提供高可用性的消息传输机制,在实际生产中应用相当广泛。 本文意在介绍Rabbitmq的基本原理,包括rabbitmq基本概念,组件的基本用途,通信过程等。 一:基本概念 先看 图片: 1.Message: 消息,是有消息头和消息体组成的。消息体是不透明的,消息体是由一些可选属性组成的,包括路由键(routing-key)、优先级(priority)、持久性存储(delivery-mode)等 2.Publisher: 消息生产者,是向交换器发送消息的客户端程序,我们可以简单理解为就是一个Java程序 3.Exchange: 交换器,用来接收生产者发送的消息,并将这些消息路由发送给服务器中的队列。消息要先经过交换器,再到队列中去。 常见的三种交换器类型: direct: 发布与订阅,完全匹配 。我们可以简单理解为一对一的关系,一个交换器将消息发送给一个队列,是完全匹配的

线程池工具ThreadPoolExecutor

人盡茶涼 提交于 2020-01-24 02:44:23
JDK1.5中引入了强大的concurrent包,其中最常用的莫过了线程池的实现ThreadPoolExecutor,它给我们带来了极大的方便,但同时,对于该线程池不恰当的设置也可能使其效率并不能达到预期的效果,甚至仅相当于或低于单线程的效率。 ThreadPoolExecutor类可设置的参数主要有: corePoolSize 在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,(除非调用了 prestartAllCoreThreads()或者 prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程)。 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中。核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出。 maxPoolSize 当线程数大于或等于核心线程,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。如果线程数已等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常。

10 阻塞队列 & 生产者-消费者模式

旧城冷巷雨未停 提交于 2020-01-24 02:40:11
原文:http://www.cnblogs.com/dolphin0520/p/3932906.html 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedList是双向链表,它实现了Dequeue接口)。 使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极大的方便性。 本文先讲述一下java.util.concurrent包下提供主要的几种阻塞队列,然后分析了阻塞队列和非阻塞队列的中的各个方法,接着分析了阻塞队列的实现原理,最后给出了一个实际例子和几个使用场景。    一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurrent包下提供了若干个阻塞队列,主要有以下几个: ArrayBlockingQueue:基于数组实现的一个阻塞队列,在创建ArrayBlockingQueue对象时必须制定容量大小。 并且可以指定公平性与非公平性,默认情况下为非公平的

记录些等待队列(wait_queue)的使用

时间秒杀一切 提交于 2020-01-23 09:41:34
贴几篇文章先... https://blog.csdn.net/hs794502825/article/details/8959459 https://blog.csdn.net/lizuobin2/article/details/51785812 记录些概念和接口。 1. 什么是睡眠? cpu调度 有 按时间片轮转, 抢占式基于优先级, 实时调度等很多方式。 不同场景使用不同调度方式。 比如Linux就是一个非硬实时的, 抢占式基于优先级, 也按时间片轮转的调度系统。 VxWorks, Nuclues等为实时操作系统(RTOS)。 简单说, 线程被挂起, cpu去干别的事了, 该线程就算睡眠了... 2. 如何睡眠? 1). 被动睡眠, 比如时间片到了, cpu调度其他线程。irq中断来了, cpu去执行isr中断处理函数等。 2). 主动睡眠, 设置当前状态为TASK_INTERRUPTIBLE, 然后调用schedule()或者schedule_timeout()函数。 会主动放弃cpu, 进入挂起状态。 3. 等待队列的使用场景? 1). 以IO操作为例, 用户态读写操作时, 如果内核态文件系统/驱动设备 不满足情况。通常会阻塞住这次IO调用。 即read, write需要等待设备/数据ready后, 才能读出, 写入数据。 内核态有几种实现方式, A. 循环判断设备状态

python queue 模块

╄→гoц情女王★ 提交于 2020-01-22 23:15:05
1 queue 模块 分类(共同点if maxsize <=0 队列长度没有限制.) queue.Queue(maxsize =0) First in first OUT(FIFO) queue.LifoQueue(maxsize=0) 后进先出(Last In First Out: LIFO)队列 PriorityQueue(maxsize=0) 优先级队列,比较队列中每个数据的大小,值最小的数据拥有出队列的优先权。数据一般以元组的形式插入,典型形式为(priority_number, data)。如果队列中的数据没有可比性,那么数据将被包装在一个类中,忽略数据值,仅仅比较优先级数字。 queue.SimpleQueue 先进先出类型的简单队列,没有大小限制。由于它是简单队列,相比于 Queue 队列会缺少一些高级功能 queue.Empty 异常 queue.Full 异常 2. queue 的方法 Queue.qsize() 返回队列中数据元素的个数。 Queue.empty() 如果队列为空,返回 True,否则返回 False。 Queue.full() 如果队列中元素个数达到上限,返回 True,否则返回 False。 Queue.put(item, block=True, timeout=None) item,放入队列中的数据元素。 block

计算机操作系统实验:模拟进程状态转换程序

ε祈祈猫儿з 提交于 2020-01-22 08:08:32
实验:模拟进程状态转换程序 一、实验内容完成情况(请写明自己已完成的项目功能): 完成进程控制块结构体的编写 创建就绪队列、阻塞队列、运行队列、完成队列、挂起队列 初始化操作系统的原始进程:可静态设置也可动态添加 编写新建进程函数 系统开始调度 当前运行进程请求 I/O 事件 某进程 I/O 完成 时间片到期 其他阻塞事件 挂起 完成先来先服务算法 完成优先级调度算法 完成时间片轮转算法 查看当前所有进程的 PCB 信息 查看当前时刻就绪队列和阻塞队伍信息 查看当前正在运行的进程信息 计算当前时刻,每个进程的周转时间。 三、模块说明及相应代码: 1、 初始化操作系统(请文字写明思路并给出核心代码): 1) 创建PCB的结构体: 思路:根据实验要求完成结构体的创建 代码: typedef struct node { char name[20]; //进程名 int id = 0; //进程ID int priority = 0; //优先级 int ArriTime = 0; //进程到达时间 int serviceTime=0; //进程总需要时间 int needTime = 0; //还需要运行时间 int CPUTime = 0; //已用CPU时间 char state[20]; //进程状态 1.Ready 2.Run 3.Wait 4.Finish int

20-Python-queue队列

别来无恙 提交于 2020-01-21 07:55:02
队列分为线程队列和进程队列。线程队列只用于多个线程之间进行数据交互,不能跨进程通信;进程队列用于父进程与子进程,或者属于同一父进程下多个子进程进行交互,不能跨进程通信。 1、FIFO FIFO = First in First out,先进先出队列 1 import queue 2 3 4 q = queue.Queue() # first in first out 5 6 q.put(1) # 放数据 7 q.put(2) 8 q.put("d1") 9 q.put("d2") 10 11 print(q.get()) 12 print(q.get()) 13 print(q.get()) 14 print(q.get()) 15 print(q.get_nowait()) # 如果用q.get()取不到数据,则会进入卡死状态 2、LIFO 后进先出队列 = Last in First out 1 import queue 2 3 q1 = queue.LifoQueue() # last in first out 4 q1.put(1) 5 q1.put(2) 6 q1.put(3) 7 8 print(q1.get()) 9 print(q1.get()) 10 print(q1.get()) 3、PriorityQueue 优先级队列,Lowest First,越小越优先

【JUC-06】JUC—阻塞队列根接口BlockingQueue原理及应用

China☆狼群 提交于 2020-01-20 22:38:02
文章目录 1. 源码解析 1.1 类接口 1. 2 接口概况解析 1.3 主要用途 1.4 主要实现类 前言:阻塞队列是高并发场景中使用较多的接口,本身提供了很多功能并且很利于生产者-消费者的实现。 1. 源码解析 1.1 类接口 BlockingQueue本身类结构如下: 本质上可当做队列,主要实现了 queue 接口,因此具有队列的先进先出(FIFO)功能,因此从方法而言,具有 Queu 及 Collection 接口方法。 1. 2 接口概况解析 本质上是一个队列,但是与普通队列有不同之处,阻塞队列,只有队列非空(有元素)时才可以获取元素,当队列非满的时候才可以添加元素,否则只能阻塞等待。 BlockingQueue常见的操作可以划分为以下四种: 操作失败时抛出异常 操作失败时抛出特定的值(null或者false) 操作失败时会阻塞当前线程直到操作成功 操作失败时会阻塞一定的时间,然后放弃 功能/出错处理 抛异常 返回特定值 阻塞 超时放弃 插入 add(e) offer(e) put(e) offer(e, time, unit) 移除 remove() poll() take() poll(time, unit) 插入 element() peek() \ \ BlockingQueue 不接收空值,当该接口实现类,试图添加( add()、 put()、 offer()