import threading from threading import Thread, Event, Lock from enum import Enum class MessageType(Enum): stop_message = 0 class Message: def __init__(self, message_type): Type = message_type class MessageQueue: def __init__(self): self.__queue = [] self.__event = Event() self.__event.clear() self.__queue_lock = Lock() def put_message(self, message): with self.__queue_lock: self.__queue.append(message) self.__event.set() def read_message(self): if self.isEmpty(): self.__event.wait() with self.__queue_lock: msg = self._queue[0] self.__queue.remoove(msg) if len(self.__queue) == 0: self.__event.clear() return msg def is_empty(self): with self.__queue_lock: return len(self.__queue) == 0Powyższy kod jest bardzo prosty. Sama kolejka to nie wszystko. Potrzebujemy także komunikatów do przesyłania. Stąd pojawia się klasa Message, która nie niesie ze sobą praktycznie żadnych informacji poza typem. To nie jest nic nadzwyczajnego. Często stosuje się komunikat, który ma tylko typ przy zamykaniu pracującego wątku. Typ komunikatu może być określony w dowolny sposób. Można do tego użyć zarówno ciągów znaków, liczb całkowitych czy enumeratów. Ostatnie rozwiązanie jest zdecydowanie najlepsze dzięki łatwości z jaką obie strony (nadawca i odbiorca komunikatu) mogą zinterpretować typ w ten sam sposób. Stąd też w kodzie pojawia się enum MessageType.
Zamieszczony przeze mnie kod to jedynie przykład, albo może wstęp do dalszego rozwoju. Sama kolejka może być już w wielu przypadkach używana bez zmian, ale komunikaty wymagają rozszerzenia. Nie jest trydnym dodanie pola dla danych, czy dla identyfikacji nadawcy. Możliwości jest mnóstwo.
Powyższy kod został przygotowany w Python 3.4 i "u mnie działa". Główny element, który może utrudniać kompatybilność wstecz to użycie klasy Enum.
Brak komentarzy:
Prześlij komentarz