[PYTHON] Multithread-Zundokokiyoshi mit Event und Queue

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

Recommended Posts

Multithread-Zundokokiyoshi mit Event und Queue
Stapel und Warteschlange in Python
Bei Verwendung von if und bei Verwendung von while
Dies und das mit reflektieren
Versuchen Sie es mit pytest-Overview und Samples-