Python 3.4シミュレーションによる生産者消費者モデルの実現


散仙はpython 3.4シミュレーションを用いて実現した生産者と消費者の例で、使用した知識はスレッド、キュー、サイクルなどがあり、ソースコードは以下の通りである.


import  queue
import time
import threading
import  random


q=queue.Queue(5)

#   
def pr():
    name=threading.current_thread().getName()
    print(name+"    ......")
    for i in range(100):
        t=random.randint(2,9)
        print(name,"    : ",t)
        time.sleep(t);
        d="A"+str(i)
        print(name+"    ",i+1,"   : ",d)
        #q.put("A"+str(i),False,2000)
        q.put(d)
    print("    !")


#   
def co():
    name=threading.current_thread().getName()
    time.sleep(1)
    print(name+"    ......")

    while True:
        print(name+"       : ",q.qsize())
        t=random.randint(2,9)
        print(name,"    : ",t)
        data=q.get();
        print(name+"      : ",data)




p=threading.Thread(target=pr,name="   ")
c=threading.Thread(target=co,name="   1")
c2=threading.Thread(target=co,name="   2")

p.start()
c.start()
c2.start()


本例では、散仙は1つの生産者スレッド、2つの消費者スレッドを起動し、印刷効果は以下の通りである.


       ......
        :  4
   1    ......
   1       :  0
   1     :  2
   2    ......
   2       :  0
   2     :  3
        1    :  A0
        :  9
   1      :  A0
   1       :  0
   1     :  8
        2    :  A1
        :  5
   2      :  A1
   2       :  0
   2     :  7
        3    :  A2
        :  8
   1      :  A2
   1       :  0
   1     :  2
        4    :  A3
        :  7
   2      :  A3
   2       :  0
   2     :  9
        5    :  A4
        :  2
   1      :  A4
   1       :  0
   1     :  5
        6    :  A5
        :  5
   2      :  A5
   2       :  0
   2     :  6
        7    :  A6
        :  7
   1      :  A6
   1       :  0
   1     :  7
        8    :  A7
        :  3
   2      :  A7
   2       :  0
   2     :  8
        9    :  A8
        :  2
   1      :  A8
   1       :  0
   1     :  4
        10    :  A9
        :  4
   2      :  A9
   2       :  0
   2     :  5
        11    :  A10
        :  2
   1      :  A10
   1       :  0
   1     :  3
        12    :  A11
        :  3
   2      :  A11
   2       :  0
   2     :  3
        13    :  A12
        :  3
   1      :  A12
   1       :  0
   1     :  3
        14    :  A13
        :  8
   2      :  A13
   2       :  0
   2     :  7
        15    :  A14
        :  3
   1      :  A14
   1       :  0
   1     :  7
        16    :  A15
        :  2
   2      :  A15
   2       :  0
   2     :  9

この例から,キューを用いて同期を行う場合に非常に簡単で便利であることが分かったが,それ以外にキューには,以下のような便利な方法がある.
            :

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()             ,