Queue—线程安全的FIFO实现

作用:提供一个线程安全的FIFO实现

Queue模块提供了一个适用于多线程编程的先进先出(first-in,first-out)数据结构,可以用来在生产者和消费者线程之间安全地传递消息或其他数据。它会为调用者处理锁定,使多个线程可以安全第处理同一个Queue实例。Queue的大小(其中包含的元素个数)可能要受限制,,以限制内存使用或处理。

1、  基本FIFO队列

Queue类实现一个基本不能的先进先出容器。使用put()将元素增加到序列一段,使用get()从另一端删除。

 import Queue

 q = Queue.LifoQueue()
a= range(5)
print u'正序列表:',a
for i in a:
q.put(i)
print u'移除队列序列:'
while not q.empty():
print q.get(),
print a= range(5)
a.sort(reverse=True)
print u'逆序列表:',a
for i in a:
q.put(i)
print u'移除队列序列:'
while not q.empty():
print q.get(),
print

显示结果:

这个例子使用一个线程,来展示按元素的插入顺序从队列删除元素。

2、  LIFO队列

与Queue的标准FIFO实现相反,LifoQueue使用了后进先出(last-in,first-out,LIFO)顺序(通常与栈数据结构关联)。

 import Queue

 q = Queue.Queue()
a= range(5)
print u'正序列表:',a
for i in a:
q.put(i)
print u'移除队列顺序:'
while not q.empty():
print q.get(),
print a= range(5)
a.sort(reverse=True)
print u'逆序列表:',a
for i in a:
q.put(i)
print u'移除队列顺序:'
while not q.empty():
print q.get(),
print

运行结果:

get将删除最近使用put插入到队列的元素。

task_cone()

在完成一项工作之后,Queue.task_done() 函数向任务已经完成的队列发送一个信号

Join()

实际上意味着等到队列为空,再执行别的操作

3、  优先队列

有些情况下,队列中元素的处理顺序需要根据这些元素的特殊性来决定,而不只是在队列中创建或插入的顺序。例如:财务部门的打印作业可以能要优先于一个开发人员打印的代码清单。PriorityQueue使用队列内容有序顺序来决定获取哪一个元素。

 import Queue
import threading class Job(object):
def __init__(self,priority,description):
self.priority = priority
self.description = description
print 'New job:',description
return
def __cmp__(self,other):
# print 'a:',self.priority
# print 'b:',other.priority
# print cmp(self.priority,other.priority)
return cmp(self.priority,other.priority) q = Queue.PriorityQueue()
q.put(Job(3,'Mid-level job'))
q.put(Job(10,'Low-level job'))
q.put(Job(1,'Important job')) def process_job(q):
while True:
next_job = q.get()
print 'Processing job:',next_job.description
q.task_done() workers = [threading.Thread(target = process_job,args = (q,)),
threading.Thread(target = process_job,args = (q,)),
]
for w in workers:
w.setDaemon(True)
w.start()
q.join()

运行结果:

这个例子有个多线程处理作业,要根据get()时队列中元素的优先级来处理。运行消费者线程时,增加到队列中的元素的处理顺序决定于线程上下文切换。

每日一“酷”之Queue的更多相关文章

  1. 每日一“酷”之Cookie

    Cookie---Http Cookie 作用:Cookie模块定义一些类来解析和创建HTTP cookie首部 Cookie模块为大多数符合RFC 2109的cookie实现一个解析器.这个实现没有 ...

  2. 每日一“酷”之pprint

    pprint – 美观打印 作用:美观打印数据结构 pprint 包含一个“美观打印机”,用于生成数据结构的一个美观视图.格式化工具会生成数据结构的一些表示,不仅可以由解释器正确地解析,而且便于人类阅 ...

  3. 每日一“酷”之copy

    Copy – 复制对象 作用:提供一些函数,可以使用浅副本或深副本语义复制对象. copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象 1.  浅副本 copy()创建的浅副 ...

  4. 每日一“酷”之heapq

    作用:heapq模块实现一个适用于Python列表的最小堆排序算法 堆(heap)是一个属性数据结构,其中子节点与父节点是一种有序关系.二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全 ...

  5. 每日一“酷”之bisect

    作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一 ...

  6. 每日一“酷”之array

    array--国定类型数据序列 array模块定义一个序列数据结构,看起来和list非常相似,只不过所有成员都必须是相同的基本类型. 1.初始化 array实例化时可以提高一个参数来描述允许哪个种数据 ...

  7. 每日一“酷”之difflib

    介绍:difflib 比较序列.该模块包含一些用来计算和处理序列直接差异的工具.她对于比较文本尤其用,其中包含的函数可以使用多种常用差异格式生成报告. 测试数据(splitlines()按行划分为序列 ...

  8. 每日一“酷”之textwrap

    介绍:需要美观打印时,可以使用textwrap模块来格式化要输出的文本,这个模块允许通过编程提高类似段落自动换行或填充特性等功能. 1 创建实例数据 sample_text = ''' I’m ver ...

  9. 每日一“酷”之string

    介绍:string模块可以追溯到最早的Python版本中.现在很多的被移植为str和unicode对象的方法,在python3.0中会被完全去除.string模块中,有很多有用的常量和累,用来处理st ...

随机推荐

  1. 【阿里云产品公测】开放搜索服务 opensearch java jdk 应用体验之 机器人聊天

    作者:阿里云用户啊里新人 需求:基本实现智能聊天! 最近在开发一款机器人,希望实现基本的聊天功能,词库是有的,但是如果是做完全匹配这个出来的效果很悲催,   比如词库:你好,回答是:哈哈,很好啊. 如 ...

  2. oracle lsnrctl

    Oracle 11G在windows 7系统上不需要设置系统环境变量. 在命令行环境中运行命令: echo %ORACLE_SID% 可以看到此变量并不存在.也可以到注册表验证: HKEY_CURRE ...

  3. javascript跨域请求RESTful Web Service

    跨域请求RESTful Web Service 当我们用js请求RESTful Web Service的时候,通常会出现跨域无法访问的问题,也就是无法正常得到我们要的值.jsonp是个解决问题的方法. ...

  4. 数据库知识(主要基于Oracle,Sql可参考)

    1.关于Union的知识 select 11 from dual union select 11 from dual 和 select 11 from dual union all select 11 ...

  5. AngularJS 学习笔记(1)

    AngularJS是一款前端JS框架.AngularJS官网 http://angularjs.org [开发环境准备]: 1,下载AngularJS:JS and CSS in Solution 2 ...

  6. 初识--Ajax & Json

    1,AJAX是一种进行页面局部异步刷新技术. 用AJAX向服务器发送请求和获得服务器返回的数据并更新到页面中. 不是刷新整个页面,而是在HTML页面中使用JavaScript创建XMLHTTPRequ ...

  7. 每天一道LeetCode--344. Reverse String

    Write a function that takes a string as input and returns the string reversed. Example:Given s = &qu ...

  8. Part 48 to 51 Talking about Access Modifiers in C#

    Part 48 Difference between Types and Type Members Part 49 Access Modifiers in C# Part 50 Internal an ...

  9. 防止服务器被暴力破解使用DenyHosts

    公司有台服务器被坏人盯上了,通过日志可以看到一直在做暴力破解ssh. 防止服务器被暴力破解使用DenyHosts 参考链接: 防止ssh破解,Ubuntu安装denyhosts的一些问题 防止你的ss ...

  10. 【学习笔记】【C语言】自增自减

    1. 简单使用 ++  自增运算符.如a++,++a,都等价于a = a+1 --自减运算符.如a--,--a,都等价于a = a-1 5++是错误的,因为5是常量 2. ++a和a++的区别 int ...