[PYTHON] Zundokokiyoshi multithread utilisant l'événement et la file d'attente

Je voulais vérifier le fonctionnement multi-thread, j'ai donc créé Zundokokiyoshi. Demandez à trois chanteurs d'enfiler et de chanter "Zun" ou "Doko" à 1 seconde d'intervalle. La file d'attente est compatible avec plusieurs threads et peut récupérer les données stockées de plusieurs threads dans l'ordre. Je compare cela à un microphone. Puisque différents threads doivent faire référence au même objet, nous comparons ZUN ou DOKO en utilisant ʻisau lieu de==`.

# -*- coding:utf-8 -*-

import time
from random import random
from threading import Thread, Event
from Queue import Queue

ZUN = "Bouse"
DOKO = "Doco"
KIYOSHI = "Ki yo shi!"

class Singer(Thread):

    def __init__(self, mic):
        '''Préparation:Tenez le microphone et attendez les instructions de début et de fin'''
        super(Singer, self).__init__()
        self.mic = mic
        self.singing = Event()

    def run(self):
        '''début:Chantez Zun ou Doko chaque seconde'''
        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):
        '''Fin:Terminer le chant'''
        if self.singing.is_set():
            self.singing.clear()
            self.join()

def zundoko():

    #Microphone
    mic = Queue()

    #Demandez à trois chanteurs de commencer à chanter dans un seul microphone
    the_number_of_singer = 3
    singers = [Singer(mic) for i in range(the_number_of_singer)]
    for singer in singers:
        singer.start()

    try:
        #Si vous entendez "Doko" après que "Zun" continue 4 fois, criez "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:
        #Que le chanteur finisse de chanter(CTRL+Même lorsqu'il est forcé de se terminer avec C)
        for singer in singers:
            singer.stop()

if __name__ == '__main__':
    zundoko()

Recommended Posts

Zundokokiyoshi multithread utilisant l'événement et la file d'attente
Pile et file d'attente en Python
Lors de l'utilisation si et lors de l'utilisation pendant
Ceci et cela en utilisant Reflect
Essayez d'utiliser pytest-Overview and Samples-