每日一“酷”之Queue

Queue—线程安全的FIFO实现

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

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

1、  基本FIFO队列

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

 1 import Queue
 2
 3 q = Queue.LifoQueue()
 4 a= range(5)
 5 print u‘正序列表:‘,a
 6 for i in a:
 7     q.put(i)
 8 print u‘移除队列序列:‘
 9 while not q.empty():
10     print q.get(),
11 print
12
13 a= range(5)
14 a.sort(reverse=True)
15 print u‘逆序列表:‘,a
16 for i in a:
17     q.put(i)
18 print u‘移除队列序列:‘
19 while not q.empty():
20     print q.get(),
21 print

显示结果:

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

2、  LIFO队列

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

 1 import Queue
 2
 3 q = Queue.Queue()
 4 a= range(5)
 5 print u‘正序列表:‘,a
 6 for i in a:
 7     q.put(i)
 8 print u‘移除队列顺序:‘
 9 while not q.empty():
10     print q.get(),
11 print
12
13 a= range(5)
14 a.sort(reverse=True)
15 print u‘逆序列表:‘,a
16 for i in a:
17     q.put(i)
18 print u‘移除队列顺序:‘
19 while not q.empty():
20     print q.get(),
21 print

运行结果:

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

task_cone()

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

Join()

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

3、  优先队列

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

 1 import Queue
 2 import threading
 3
 4 class Job(object):
 5     def __init__(self,priority,description):
 6         self.priority = priority
 7         self.description = description
 8         print ‘New job:‘,description
 9         return
10     def __cmp__(self,other):
11 #         print ‘a:‘,self.priority
12 #         print ‘b:‘,other.priority
13 #         print cmp(self.priority,other.priority)
14         return cmp(self.priority,other.priority)
15
16
17 q = Queue.PriorityQueue()
18 q.put(Job(3,‘Mid-level job‘))
19 q.put(Job(10,‘Low-level job‘))
20 q.put(Job(1,‘Important job‘))
21
22 def process_job(q):
23     while True:
24         next_job = q.get()
25         print ‘Processing job:‘,next_job.description
26         q.task_done()
27
28 workers = [threading.Thread(target = process_job,args = (q,)),
29            threading.Thread(target = process_job,args = (q,)),
30            ]
31 for w in workers:
32     w.setDaemon(True)
33     w.start()
34 q.join()

运行结果:

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

时间: 2024-12-18 21:10:49

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

每日一“酷”之heapq

作用:heapq模块实现一个适用于Python列表的最小堆排序算法 堆(heap)是一个属性数据结构,其中子节点与父节点是一种有序关系.二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树).可以使用以下如下方式组织的列表或数表示,即元素N的子元素位于2*N+1和2*N+2.这种布局允许原地重新组织堆,从而不必再增加或删除元素时分配大量内存. 最大堆确保父节点大于或等于其两个子节点.最小堆要求父节点小雨或等于其子节点.Python的heqpq模块实现了一个最小堆. 1.

每日一“酷”之array

array--国定类型数据序列 array模块定义一个序列数据结构,看起来和list非常相似,只不过所有成员都必须是相同的基本类型. 1.初始化 array实例化时可以提高一个参数来描述允许哪个种数据类型,还可以有一个初始的数据序列存储在数组中. 1 import array 2 import binascii 3 s = 'This is the array.' 4 a = array.array('c',s) 5 6 print 'As string:', s 7 print 'As arr

每日一“酷”之pprint

pprint – 美观打印 作用:美观打印数据结构 pprint 包含一个“美观打印机”,用于生成数据结构的一个美观视图.格式化工具会生成数据结构的一些表示,不仅可以由解释器正确地解析,而且便于人类阅读.输出尽可能放在一行上,分解为多行时则需要缩进. 这一节中的列子都用到了pprint_data.py,其中包含一下数据 1 data = [(1,{'a':'A','b':'B','c':'C','d':'D'}), 2 (2,{'e':'E','f':'F','g':'G','h':'H', 3

每日一“酷”之copy

Copy – 复制对象 作用:提供一些函数,可以使用浅副本或深副本语义复制对象. copy模块包括两个函数copy()和deepcopy(),用于复制现有的对象 1.  浅副本 copy()创建的浅副本(shallow copy)是一个新容器,其中填充原对象内容的引用.建立list对象的一个浅副本时,会构造一个新的list,并将原对象的元素追加到这个list. 1 import copy 2 3 class MyClass(object): 4 def __init__(self,name):

每日一“酷”之bisect

作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一个大列表之后再显式对齐排序更为高效 1.有序插入 使用insort()按有序顺序像一个列表中插入元素 1 import bisect 2 import random 3 random.seed(1) 4 5 print 'New Pos Contents' 6 print '--- --- ----

每日一“酷”之difflib

介绍:difflib 比较序列.该模块包含一些用来计算和处理序列直接差异的工具.她对于比较文本尤其用,其中包含的函数可以使用多种常用差异格式生成报告. 测试数据(splitlines()按行划分为序列列表): text1 = """ We all know that English is very useful. Many people in the world speak English. So more and more people in China study it.

每日一“酷”之Cookie

Cookie---Http Cookie 作用:Cookie模块定义一些类来解析和创建HTTP cookie首部 Cookie模块为大多数符合RFC 2109的cookie实现一个解析器.这个实现没有标准那么严格,因为,MSIE 3.0X并不支持整个标准. RFC 2109 HTTP状态管理机制 1.  创建和设置Cookie 可以用Cookie为机遇浏览器的应用实现状态管理,因此,Cookie通常由服务器设置,并由客户存储和返回.下面是一个创建cookie的最简单的例子. import Coo

每日一“酷”之textwrap

介绍:需要美观打印时,可以使用textwrap模块来格式化要输出的文本,这个模块允许通过编程提高类似段落自动换行或填充特性等功能. 1 创建实例数据 1 sample_text = ''' 2 I’m very happy and I like to make friends with others. 3 I also like singing but traveling is my favorite, I have been to many interesting places in Chin

每日一“酷”之string

介绍:string模块可以追溯到最早的Python版本中.现在很多的被移植为str和unicode对象的方法,在python3.0中会被完全去除.string模块中,有很多有用的常量和累,用来处理string和unicode对象. 一. 函数 1.capwords()的作用是将一个字符串中所有单词的首字母大写: 1 import string 2 s = 'We believe one thing,today is difficult,tomorrow is more difficult,but