天天看點

python Queue子產品

建立一個“隊列”對象

import Queue

myqueue = Queue.Queue(maxsize = 10)

Queue.Queue類即是一個隊列的同步實作。隊列長度可為無限或者有限。可通過Queue的構造函數的可選參數maxsize來設定隊列長度。如果maxsize小于1就表示隊列長度無限。

将一個值放入隊列中

myqueue.put(10)

調用隊列對象的put()方法在隊尾插入一個項目。put()有兩個參數,第一個item為必需的,為插入項目的值;第二個block為可選參數,預設為1。如果隊列目前為空且block為1,put()方法就使調用線程暫停,直到空出一個資料單元。如果block為0,put方法将引發Full異常。

将一個值從隊列中取出

myqueue.get()

調用隊列對象的get()方法從隊頭删除并傳回一個項目。可選參數為block,預設為True。如果隊列為空且block為True,get()就使調用線程暫停,直至有項目可用。如果隊列為空且block為False,隊列将引發Empty異常。

python queue子產品有三種隊列:

1、python queue子產品的FIFO隊列先進先出。

2、LIFO類似于堆。即先進後出。

3、還有一種是優先級隊列級别越低越先出來。 

針對這三種隊列分别有三個構造函數:

1、class Queue.Queue(maxsize) FIFO 

2、class Queue.LifoQueue(maxsize) LIFO 

3、class Queue.PriorityQueue(maxsize) 優先級隊列 

介紹一下此包中的常用方法:

Queue.qsize() 傳回隊列的大小 

Queue.empty() 如果隊列為空,傳回True,反之False 

Queue.full() 如果隊列滿了,傳回True,反之False

Queue.full 與 maxsize 大小對應 

Queue.get([block[, timeout]])擷取隊列,timeout等待時間 

Queue.get_nowait() 相當Queue.get(False)

非阻塞 Queue.put(item) 寫入隊列,timeout等待時間 

Queue.put_nowait(item) 相當Queue.put(item, False)

Queue.task_done() 在完成一項工作之後,Queue.task_done()函數向任務已經完成的隊列發送一個信号

Queue.join() 實際上意味着等到隊列為空,再執行别的操作

附上一個例子:

#coding:utf-8

import threading

import time

import random

q = Queue.Queue(0) #當有多個線程共享一個東西的時候就可以用它了

NUM_WORKERS = 3

class MyThread(threading.Thread):

    def __init__(self,input,worktype):

       self._jobq = input

       self._work_type = worktype

       threading.Thread.__init__(self)

    def run(self):

       while True:

           if self._jobq.qsize() > 0:

               self._process_job(self._jobq.get(),self._work_type)

           else:break

    def _process_job(self, job, worktype):

       doJob(job,worktype)

def doJob(job, worktype):

   time.sleep(random.random() * 3)

    print"doing",job," worktype ",worktype

if __name__ == '__main__':

    print "begin...."

    for i inrange(NUM_WORKERS * 2):

       q.put(i) #放入到任務隊列中去

    print "job qsize:",q.qsize()

    for x inrange(NUM_WORKERS):

       MyThread(q,x).start()

本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/1979275

,如需轉載請自行聯系原作者