Ich wollte die Multithread-Operation überprüfen, also habe ich [Zundokokiyoshi] erstellt (http://qiita.com/shunsugai@github/items/971a15461de29563bf90).
Bitten Sie drei Sänger, im Abstand von 1 Sekunde "Zun" oder "Doko" einzufädeln und zu singen.
Die Warteschlange ist Multithread-kompatibel und kann gespeicherte Daten nacheinander von mehreren Threads abrufen. Ich vergleiche das mit einem Mikrofon.
Da sich verschiedene Threads auf dasselbe Objekt beziehen sollten, vergleichen wir ZUN oder DOKO mit is
anstelle von ==
.
# -*- coding:utf-8 -*-
import time
from random import random
from threading import Thread, Event
from Queue import Queue
ZUN = "Dung"
DOKO = "Doco"
KIYOSHI = "Ki yo shi!"
class Singer(Thread):
def __init__(self, mic):
'''Vorbereitung:Halten Sie das Mikrofon gedrückt und warten Sie auf die Start- und Endanweisungen'''
super(Singer, self).__init__()
self.mic = mic
self.singing = Event()
def run(self):
'''Start:Singe jede Sekunde Zun oder Doko'''
self.singing.set()
while self.singing.is_set():
time.sleep(1)
word = ZUN if random() < 0.5 else DOKO
self.mic.put(word)
def stop(self):
'''Ende:Hör auf zu singen'''
if self.singing.is_set():
self.singing.clear()
self.join()
def zundoko():
#Mikrofon
mic = Queue()
#Lassen Sie drei Sänger in ein Mikrofon singen
the_number_of_singer = 3
singers = [Singer(mic) for i in range(the_number_of_singer)]
for singer in singers:
singer.start()
try:
#Wenn Sie "Doko" hören, nachdem "Zun" viermal fortgesetzt wurde, rufen Sie "Ki Yo Shi!"
zun = 0
kiyoshi = False
while kiyoshi == False:
word = mic.get()
print word
if word is ZUN:
zun += 1
elif word is DOKO:
if zun >= 4:
kiyoshi = True
zun = 0
print KIYOSHI
finally:
#Lassen Sie den Sänger fertig singen(CTRL+Auch wenn gezwungen, mit C zu beenden)
for singer in singers:
singer.stop()
if __name__ == '__main__':
zundoko()