import Queue

myqueue = Queue.Queue(maxsize = 10)

Queue.Queue类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。

将一个值放入队列中

myqueue.put(10)

调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。

将一个值从队列中取出

myqueue.get()

调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为True。如果队列为空且block为True,get()就使调用线程暂停,直至有项目可用。如果队列为空且block为False,队列将引发Empty异常。

python queue模块有三种队列:

1、python queue模块的FIFO队列先进先出。

2、LIFO类似于堆。即先进后出。

3、还有一种是优先级队列级别越低越先出来。

针对这三种队列分别有三个构造函数:

1、class Queue.Queue(maxsize) FIFO

2、class Queue.LifoQueue(maxsize) LIFO

3、class Queue.PriorityQueue(maxsize) 优先级队列

介绍一下此包中的常用方法:

二、API介绍

该模块包含以下函数:

1.Queue.qsize()

该函数返回消息队列的当前空间。

2.Queue.empty()

该函数判断消息队列是否为空,返回True或False。

3.Queue.full()

该函数判断消息队列是否满,返回True或False。 Queue.full 与 maxsize 大小对应

4.Queue.put(item, block=True, timeout=None)

该函数用来消息队列中存放消息。block参数可以控制是否阻塞,timeout指定阻塞的等待时间。如果不阻塞或者超时,会引起一个full exception。

5.Queue.put_nowait(item)

该函数相当于put(item, False)。

6.Queue.get(block=True, timeout=None)

该函数用于获取消息,其他同put相同。 Queue.get_nowait() 相当Queue.get(False)

7.Queue.task_done()

该函数接受消息的线程通过调用这个函数来说明消息对应的任务已完成。

8.Queue.join()

该函数调用线程阻塞直到所有消息对应的任务已经完成。

1 import Queue

2 import threading

3 import time

4 import random

5

6 q = Queue.Queue(0) #当有多个线程共享一个东西的时候就可以用它了

7 NUM_WORKERS = 3

8

9 class MyThread(threading.Thread):

10

11     def __init__(self,input,worktype):

12        self._jobq = input

13        self._work_type = worktype

14        threading.Thread.__init__(self)

15

16     def run(self):

17        while True:

18            if self._jobq.qsize() > 0:

19                self._process_job(self._jobq.get(),self._work_type)

20            else:break

21

22     def _process_job(self, job, worktype):

23        doJob(job,worktype)

24

25 def doJob(job, worktype):

26    time.sleep(random.random() * 3)

27     print"doing",job," worktype ",worktype

28

29 if __name__ == '__main__':

30     print "begin...."

31     for i inrange(NUM_WORKERS * 2):

32        q.put(i) #放入到任务队列中去

33     print "job qsize:",q.qsize()

34

35     for x inrange(NUM_WORKERS):

36        MyThread(q,x).start()

一些需要注意的地方:

1. 阻塞模式

import Queue

q = Queue.Queue(10)

......

for i in range(10):

q.put('A')

time.sleep(0.5)

这是一段极其简单的代码(另有两个线程也在操作队列q),我期望每隔0.5秒写一个'A'到队列中,但总是不能如愿:间隔时间有时会远远超过0.5秒。原来,Queue.put()默认有 block = True 和 timeou 两个参数。当  block = True 时,写入是阻塞式的,阻塞时间由 timeou  确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常。

2. 无法捕获 exception Queue.Empty 的异常

while True:

......

try:

data = q.get()

except Queue.Empty:

break

我的本意是用队列为空时,退出循环,但实际运行起来,却陷入了死循环。这个问题和上面有点类似:Queue.get()默认的也是阻塞方式读取数据,队列为空时,不会抛出 except Queue.Empty ,而是进入阻塞直至超时。 加上block=False 的参数,问题迎刃而解。

https://www.cnblogs.com/shiluoliming/p/6428222.html

python 消息队列 get是从队首还是队尾取东西_Python -- queue队列模块相关推荐

  1. python 消息队列 get是从队首还是队尾取东西_python分布式爬虫中消息队列知识点详解...

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  2. python 消息队列 get是从队首还是队尾取东西_从零开始Python对redis作为消息队列的使用...

    一.Redis 服务 1.安装 yum install redis 2. python安装支持模块 /opt/python2.7.13/bin/pip install redis 3. 和redis的 ...

  3. 操作系统实验二——时间片轮转调度算法(RR算法)(新进程放队首和队尾两种C++实现)

    情况介绍 基本原理 系统将所有就绪进程按照FCFS的原则,排成一个队列依次调度. 把CPU分配给队首进程,执行一个时间片(10-100ms). 时间片用完后,系统计时器发出时钟中断,该进程将被剥夺CP ...

  4. python 队列实现_Python Queue队列实现线程通信

    queue 模块下提供了几个阻塞队列,这些队列主要用于实现线程通信.在 queue 模块下主要提供了三个类,分别代表三种队列,它们的主要区别就在于进队列.出队列的不同. 关于这三个队列类的简单介绍如下 ...

  5. python 优先队列_Python Queue队列实现线程通信

    queue 模块下提供了几个阻塞队列,这些队列主要用于实现线程通信.在 queue 模块下主要提供了三个类,分别代表三种队列,它们的主要区别就在于进队列.出队列的不同.关于这三个队列类的简单介绍如下: ...

  6. python queue 查询是否在队列中_Python queue队列

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  7. c++数据结构中 顺序队列的队首队尾_yiduobo的每日leetcode 622.设计循环队列

    祖传的手艺不想丢了,所以按顺序写一个leetcode的题解.计划每日两题,争取不卡题吧. 622.设计循环队列https://leetcode-cn.com/problems/design-circu ...

  8. 考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)

    题目 设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空,约定当tag为0时队空,当tag为1时队不空,这样就可以用front==rear作为队满 ...

  9. 队列的入队/出队操作

    //............编程实现队列的入队/出队操作 (先进先出) #include<iostream> using namespace std; //node表示队列中每个节点元素 ...

最新文章

  1. 从XXX 产品的失败谈起
  2. GUN Global + Vim及其插件 打造Android源码阅读器
  3. 代理(Proxy)模式
  4. ICEM(1)—边界结构网格绘制
  5. 跨越跨域大山,前端不得不知道的Ajax
  6. 性能优化CPU、内存、磁盘I/O、网络性能相关命令
  7. 使用React和axios设置服务器端渲染的最简单方法
  8. Transformer在计算机视觉领域走到哪了?
  9. CVPR2020 | 遮挡也能识别?地平线提出用时序信息提升行人检测准确度
  10. github 搜索_如何通过GitHub快速的搜索资源?
  11. CPU的平均指令周期 怎么算,如何计算处理器的机器周期
  12. 2022.10.13(四)[仿写《百草园到三味书屋》第二段]
  13. 基金量化交易系统如何实现套利成功?
  14. 字节鏖战美团的关键一役
  15. 51学工坊整理|甲骨文Oracle数据库 21c来了,来看看有哪些创新技术
  16. android ping tools,PingTools
  17. RabbitMQ 面试题目整理
  18. NOIP2017+停课总结
  19. 4K电视与4K显示器的选择
  20. Scard API 智能卡操作

热门文章

  1. java跨平台 ios_Smobiler如何实现.net一键开发,ios和android跨平台运行
  2. 查看电脑ip地址的几种方法(详细简单)
  3. Android 自动广告轮播图
  4. 计算机毕业设计Java宠物寄存中心计时收费系统(源码+系统+mysql数据库+lw文档)
  5. 字节番茄小说一面+二面+三面,本以为挂了,却意外收到offer
  6. sdcs V2.3 exe/dll 正+反弹后门(转)
  7. 路飞学城linux第三模块考试,路飞学城-爬虫集训营-第三章
  8. 巴萨2-1逆转击败阿森纳 史上第2次夺冠,加冕欧洲冠军
  9. 信必优成功案例:中信证券
  10. JSON-RPC协议