天天看點

42. Python Queue 子產品

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