środa, 24 września 2014

Python: implementacja kolejki komunikatów

Coraz bardziej zagłębiam się w wiedzę tajemną o języku Python i aktualnie zgłębiam piękno wątków. Moduł threading dostarcza całkiem sporo możliwości. Zawiera on jednak tylko klasy do synchronizacji i praktycznie żadnej do komunikacji. Typową dla mnie metodą komunikacji stały się kolejki komunikatów. Poniżej zamieszczam swoją implementację kolejki.

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) == 0
Powyż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