Python提供了Queue模块来专门实现消息队列Queue对象
Queue对象实现一个fifo队列(其他的还有lifo、priority队列,这里不再介绍)。
queue只有maxsize一个构造参数,用来指定队列容量,指定为0的时候代表容量无限。
主要有以下成员函数:
Queue.qsize():返回消息队列的当前空间。返回的值不一定可靠。
Queue.empty():判断消息队列是否为空,返回True或False。同样不可靠。
Queue.not_empty():判断消息队列是否为非空。同上不可靠。
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():表示等待,等到队列为空,在执行别的操作。
Queue.terminate():表示强制关闭。
例子:
<code>#!/usr/bin/env python</code>
<code># -*- coding:utf-8 -*-</code>
<code>from</code> <code>multiprocessing </code><code>import</code> <code>Queue</code>
<code>from</code> <code>threading </code><code>import</code> <code>Thread</code>
<code>import</code> <code>time</code>
<code>"""</code>
<code>写一个消费者和生产者,</code>
<code>用多线程方式实现,</code>
<code>通过类的重写的方法实现。</code>
<code>class</code> <code>Proceducer(Thread):</code>
<code> </code><code>def</code> <code>__init__(</code><code>self</code><code>, queue):</code>
<code> </code><code>super</code><code>(Proceducer,</code><code>self</code><code>).__init__()</code>
<code> </code><code>self</code><code>.queue </code><code>=</code> <code>queue</code>
<code> </code><code>def</code> <code>run(</code><code>self</code><code>):</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>for</code> <code>i </code><code>in</code> <code>xrange</code><code>(</code><code>1</code><code>, </code><code>10</code><code>):</code>
<code> </code><code>print</code> <code>(</code><code>"put data is {0} to queue"</code><code>.</code><code>format</code><code>(i))</code>
<code> </code><code>self</code><code>.queue.put(i)</code>
<code> </code><code>except</code> <code>Exception as e:</code>
<code> </code><code>print</code> <code>(</code><code>"put data error"</code><code>)</code>
<code> </code><code>raise</code> <code>e</code>
<code>class</code> <code>Consumer_even(Thread):</code>
<code> </code><code>super</code><code>(Consumer_even , </code><code>self</code><code>).__init__()</code>
<code> </code><code>while</code> <code>not</code> <code>self</code><code>.queue.empty():</code>
<code> </code><code>number </code><code>=</code> <code>self</code><code>.queue.get(block</code><code>=</code><code>True</code><code>, timeout</code><code>=</code><code>3</code><code>)</code>
<code> </code><code>if</code> <code>number </code><code>%</code> <code>2</code> <code>!</code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>"get {0} from queue EVEN, thread name is {1}"</code><code>.</code><code>format</code><code>(number, </code><code>self</code><code>.getName()))</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code>self</code><code>.queue.put(number)</code>
<code> </code><code>time.sleep(</code><code>1</code><code>)</code>
<code>class</code> <code>Consumer_odd(Thread):</code>
<code> </code><code>super</code><code>(Consumer_odd , </code><code>self</code><code>).__init__()</code>
<code> </code><code>if</code> <code>number </code><code>%</code> <code>2</code> <code>=</code><code>=</code> <code>0</code><code>:</code>
<code> </code><code>print</code><code>(</code><code>"get {0} from queue ODD"</code><code>.</code><code>format</code><code>(number))</code>
<code>def</code> <code>main():</code>
<code> </code><code>queue </code><code>=</code> <code>Queue()</code>
<code> </code><code>p </code><code>=</code> <code>Proceducer(queue</code><code>=</code><code>queue)</code>
<code> </code><code>p.start()</code>
<code> </code><code>p.join()</code>
<code> </code><code>time.sleep(</code><code>1</code><code>)</code>
<code> </code><code>c1 </code><code>=</code> <code>Consumer_even(queue</code><code>=</code><code>queue)</code>
<code> </code><code>c2 </code><code>=</code> <code>Consumer_odd(queue</code><code>=</code><code>queue)</code>
<code> </code><code>c1.start()</code>
<code> </code><code>c2.start()</code>
<code> </code><code>c1.join()</code>
<code> </code><code>c2.join()</code>
<code> </code><code>print</code> <code>(</code><code>"All thread terminate!"</code><code>)</code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>'__main__'</code><code>:</code>
<code> </code><code>main()</code>
结果:
<code>put data is 1 to queue</code>
<code>put data is 2 to queue</code>
<code>put data is 3 to queue</code>
<code>put data is 4 to queue</code>
<code>put data is 5 to queue</code>
<code>put data is 6 to queue</code>
<code>put data is 7 to queue</code>
<code>put data is 8 to queue</code>
<code>put data is 9 to queue</code>
<code>get 1 from queue EVEN, thread name is Thread-2</code>
<code>get 2 from queue ODD</code>
<code>get 3 from queue EVEN, thread name is Thread-2</code>
<code>get 4 from queue ODD</code>
<code>get 5 from queue EVEN, thread name is Thread-2</code>
<code>get 6 from queue ODD</code>
<code>get 7 from queue EVEN, thread name is Thread-2</code>
<code>get 8 from queue ODD</code>
<code>get 9 from queue EVEN, thread name is Thread-2</code>
<code>All thread terminate!</code>
本文转自 听丶飞鸟说 51CTO博客,原文链接:http://blog.51cto.com/286577399/2051848