pythonマルチスレッドキューセキュリティ


これは古典的な「生産者消費者」の例です.
python queueモジュールには3つのキューがあります.1、python queueモジュールのFIFOキューが先に出ます.2、LIFOはスタックに似ています.すなわち先に進んで後に出る.3、優先順位キューレベルが低いほど先に出るものもあります. 
この3つのキューにはそれぞれ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を返します.フル()キューがいっぱいになったらTrueを返し、逆にFalseQueueを返します.fullはmaxsizeサイズに対応するQueue.get([block[,timeout]))取得キュー,timeout待ち時間Queue.get_相当な量だget(False)非ブロックQueue.put(item)書き込みキュー、timeout待ち時間Queue.put_nowait(item)相当Queue.put(item, False)Queue.task_done()は仕事を終えた後、Queue.task_done()関数はタスクが完了したキューに信号Queueを送信する.join()は、実際にはキューが空になるまで待ってから別の操作を実行することを意味します.
コード:
#!/home/oracle/dbapython/bin/python
#encoding=utf-8
import threading
import time
from Queue import Queue

class Producer(threading.Thread):
    def run(self):
        global queue
        count = 0
        while True:
            for i in range(100):
                if queue.qsize() > 1000:
                     pass
                else:
                     count = count +1
                     msg = '    '+str(count)
                     queue.put(msg)
                     print msg
            time.sleep(1)

class Consumer(threading.Thread):
    def run(self):
        global queue
        while True:
            for i in range(3):
                if queue.qsize() < 50:
                    pass
                else:
                    msg = self.name + '    '+queue.get()
                    print msg
            time.sleep(1)

queue = Queue()

def test():
    for i in range(100):
        msg='    '+str(i)
        print msg
        queue.put(msg)
    for i in range(2):
        p = Producer()
        p.start()
    for i in range(5):
        c = Consumer()
        c.start()
if __name__ == '__main__':
    test()