day42——queue模块

Python提供了Queue模块来专门实现消息队列Queue对象
Queue对象实现一个fifo队列(其他的还有lifo、priority队列,这里不再介绍)。queue只有maxsize一个构造参数,用来指定队列容量,指定为0的时候代表容量无限。主要有以下成员函数:
Queue.qsize():返回消息队列的当前空间。返回的值不一定可靠。
Queue.empty():判断消息队列是否为空,返回True或False。同样不可靠。
Queue.full():类似上边,判断消息队列是否满
Queue.put(item, block=True, timeout=None):往消息队列中存放消息。block可以控制是否阻塞,timeout指定阻塞时候的等待时间。如果不阻塞或者超时,会引起一个full exception。
Queue.put_nowait(item):相当于put(item, False).
Queue.get(block=True, timeout=None):获取一个消息,其他同put。

以下两个函数用来判断消息对应的任务是否完成。
Queue.task_done():接受消息的线程通过调用这个函数来说明消息对应的任务已完成。
Queue.join(): 实际上意味着等到队列为空,再执行别的操作

例子:

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # @time: 2017/12/18 19:31
 4 # Author: caicai
 5 # @File: demon3.py
 6
 7 ‘‘‘写一个消费者和生产者,为了练习多线程,用多线程的方式实现,并通过类的重写的方法来实现‘‘‘
 8 from Queue import Queue
 9 from threading import Thread
10 import time
11
12 #生成类,输出一堆数字
13 class Proceduer(Thread):
14     def __init__(self,queue):
15         super(Proceduer, self).__init__()
16         self.queue = queue
17     def run(self):
18         try:
19             for i in xrange(1,10):
20                 print("put data is: {0} to queue".format(i))
21                 self.queue.put(i)
22
23         except Exception as e:
24             print("put data error!")
25             raise e
26
27 #消费者类
28 class Consumer_odd(Thread):
29     def __init__(self,queue):
30         super(Consumer_odd, self).__init__()
31         self.queue = queue
32     def run(self):
33         try:
34             while not self.queue.empty():
35                 number = self.queue.get()
36                 if number % 2 != 0:
37                     print("get {0} from queue ODD".format(number))
38                 else:
39                     self.queue.put(number)
40                 time.sleep(1)
41         except Exception as e:
42             raise e
43
44 class Consumer_even(Thread):
45     def __init__(self,queue):
46         super(Consumer_even, self).__init__()
47         self.queue = queue
48     def run(self):
49         try:
50             while not self.queue.empty(): #queue.empty()
51                 number = self.queue.get()
52                 if number % 2 == 0:
53                     print("get {0} from queue EVEN,thread name is: {1}".format(number, self.getName()))
54                 else:
55                     self.queue.put(number)
56                 time.sleep(1)
57         except Exception as e:
58             raise e
59
60 def main():
61     queue = Queue()
62
63     p = Proceduer(queue=queue)
64     p.start()
65     p.join()
66     time.sleep(1)
67     c1 = Consumer_odd(queue=queue)
68     c2 = Consumer_even(queue=queue)
69     c1.start()
70     c2.start()
71     c1.join()
72     c2.join()
73
74     print("All threads terminate!")
75
76 if __name__ == ‘__main__‘:
77     main()
78
79 输出结果:
80
81 put data is: 1 to queue
82 put data is: 2 to queue
83 put data is: 3 to queue
84 put data is: 4 to queue
85 put data is: 5 to queue
86 put data is: 6 to queue
87 put data is: 7 to queue
88 put data is: 8 to queue
89 put data is: 9 to queue
90 get 1 from queue ODD
91 get 2 from queue EVEN,thread name is: Thread-3
92 get 5 from queue ODD
93 get 6 from queue EVEN,thread name is: Thread-3
94 get 7 from queue ODD
95 get 8 from queue EVEN,thread name is: Thread-3
96 get 9 from queue ODD
97 get 4 from queue EVEN,thread name is: Thread-3get 3 from queue ODD
98
99 All threads terminate!
时间: 2024-08-13 17:30:39

day42——queue模块的相关文章

【[email protected]】queue模块-生产者消费者问题

python通过queue模块来提供线程间的通信机制,从而可以让线程分项数据. 个人感觉queue就是管程的概念 一个生产者消费者问题 1 from random import randint 2 from threading import Thread 3 from queue import Queue 4 from time import sleep 5 6 7 def writeq(queue): 8 print('starting put queue...') 9 queue.put('

Python多线程(3)——Queue模块

Queue模块支持先进先出(FIFO)队列,支持多线程的访问,包括一个主要的类型(Queue)和两个异常类(exception classes). Python 2 中的Queue模块在Python 3中更名为 queue. Queue对象的创建 可以通过实例化Queue类型获得队列对象: q = Queue.Queue(maxsize=0) 创建新的队列,参数 maxsize 的含义是: 如果 maxsize > 0:当 q 中的元素达到 maxsize 个时,队列就满了,此时再有一个线程希望

Python Queue模块

创建一个"队列"对象 import Queuemyqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的可选参数maxsize来设定队列长度.如果maxsize小于1就表示队列长度无限. 将一个值放入队列中 myqueue.put(10) 调用队列对象的put()方法在队尾插入一个项目.put()有两个参数,第一个item为必需的,为插入项目的值:第二个block为可选参

python Queue模块使用

Python中,队列是线程间最常用的交换数据的形式.Queue模块是提供队列操作的模块,虽然简单易用,但是不小心的话,还是会出现一些意外. 创建一个"队列"对象import Queueq = Queue.Queue(maxsize = 10)Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的可选参数maxsize来设定队列长度.如果maxsize小于1就表示队列长度无限. 将一个值放入队列中q.put(10)    put(item[

Python之queue模块

一.queue——同步的队列类 queue模块实现了多生产者,多消费者的队列.当 要求信息必须在多线程间安全交换,这个模块在 线程编程时非常有用 .Queue模块实现了所有要求的锁机制.  说了半天就是Queue模块主要是多线程,保证线程安全使用的. 这个类实现了三种类型的queue,区别仅仅在于进去和取出的位置.在一个FIFO(First In,First Out)队列中,先加先取.在一个LIFO(Last In First Out)的队列中,最后加的先出来(操作起来跟stack一样).pri

Python:线程、进程与协程(3)——Queue模块及源码分析

Queue模块是提供队列操作的模块,队列是线程间最常用的交换数据的形式.该模块提供了三种队列: Queue.Queue(maxsize):先进先出,maxsize是队列的大小,其值为非正数时为无线循环队列 Queue.LifoQueue(maxsize):后进先出,相当于栈 Queue.PriorityQueue(maxsize):优先级队列. 其中LifoQueue,PriorityQueue是Queue的子类.三者拥有以下共同的方法: qsize():返回近似的队列大小.为什么要加"近似&q

python Queue模块用于多线程通信

# -*-coding:utf-8 -*- import Queue import threading import time q = Queue.Queue(100000) def producer():     for i in range(1000):         q.put(i)         time.sleep(0) def consumer():     for i in range(1000):         print q.get(), q.qsize()       

用threading和Queue模块实现多线程的端口扫描器

一.Queue模块基础 q = Queue.Queue()    q.qsize()           返回队列的大小  q.empty()         如果队列为空,返回True,反之False  q.full()        如果队列满了,返回True,反之False q.full            与 maxsize 大小对应  q.get([block[, timeout]]) 获取队列,timeout等待时间  q.get_nowait()         相当q.get(

Python 单向队列Queue模块详解

单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import threading except ImportError: import dummy_threading as threading from collections import deque from heapq import heappush, heappop from time import monotonic as time __all__ =