Python 3.4シミュレーションによる生産者消費者モデルの実現
散仙はpython 3.4シミュレーションを用いて実現した生産者と消費者の例で、使用した知識はスレッド、キュー、サイクルなどがあり、ソースコードは以下の通りである.
本例では、散仙は1つの生産者スレッド、2つの消費者スレッドを起動し、印刷効果は以下の通りである.
この例から,キューを用いて同期を行う場合に非常に簡単で便利であることが分かったが,それ以外にキューには,以下のような便利な方法がある.
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() ,