Heim >Backend-Entwicklung >Python-Tutorial >Parallelitätsmuster: Blockierungsmuster
Das Balking Design Pattern ist ein Verhaltensdesignmuster, das zur Verwaltung zustandsabhängiger Aktionen in einem System verwendet wird. Es stellt sicher, dass Vorgänge nur dann ausgeführt werden, wenn sich das System in einem geeigneten Zustand befindet. Wenn die erforderliche Voraussetzung nicht erfüllt ist, wird der Vorgang abgebrochen oder das System „blockiert“. Für diejenigen wie mich, die nicht wissen, was Balking ist, sagt Google Folgendes dazu: „Zögern Sie oder seien Sie nicht bereit, eine Idee oder ein Unternehmen anzunehmen“. Dieses Muster ist besonders nützlich in Multithread-Umgebungen oder -Systemen, in denen ungültige Aktionen zu Konflikten oder Fehlern führen können.
Balking-Muster werden von einigen Leuten in der Community auch eher als Anti-Muster denn als Design-Muster angesehen. Wenn ein Objekt seine API nicht unterstützen kann, sollte es entweder die API einschränken, sodass der fehlerhafte Aufruf nicht verfügbar ist oder der Aufruf ohne Einschränkung durchgeführt werden kann. Dies ist ein altes Muster, das offenbar entstanden ist, als JVMs langsamer waren und die Synchronisierung nicht so gut verstanden und implementiert wurde wie heute. Unabhängig davon ist es eine Diskussion wert und ob es verwendet wird oder nicht, liegt bei den Entwicklern.
Lassen Sie uns diese anhand eines Beispiels verstehen:
Ein Drucksystem demonstriert das Balking-Muster:
Hinweis: Ja, wir können dies mit einer Warteschlange bewältigen, aber nehmen wir zunächst an, dass wir nicht wissen, dass eine so elegante Datenstruktur existiert.
import threading import time class Printer: def __init__(self): self.state = "idle" self.lock = threading.Lock() def start_printing(self, job_id): print(f"Attempting to start Print Job {job_id}...") with self.lock: # Ensure thread safety if self.state == "printing": print(f"Balking: Print Job {job_id} cannot start. Printer is busy.") return self.state = "printing" # Simulate the printing process print(f"Print Job {job_id} started.") time.sleep(3) print(f"Print Job {job_id} completed.") with self.lock: self.printing = "idle" # Multiple threads attempting to start print jobs printer = Printer() threads = [ threading.Thread(target=printer.start_printing, args=(1,)), threading.Thread(target=printer.start_printing, args=(2,)) ] for t in threads: t.start() for t in threads: t.join()
Wenn wir uns den Code ansehen, können wir sehen, dass, wenn wir eine Druckanforderung start_printing an den Drucker senden und der Drucker beschäftigt ist, er seinen aktuellen Status self.state überprüft und wenn der Status „Drucken“ lautet, er zurückkehrt, ohne etwas zu tun . Andernfalls wird die Anfrage angenommen und der Status entsprechend angepasst.
Das Balking Design Pattern bietet eine effektive Möglichkeit, zustandsabhängige Aktionen zu verwalten und ungültige Vorgänge in Softwaresystemen zu verhindern. Durch die Einführung klarer Schutzbedingungen und die Gewährleistung der Thread-Sicherheit wird die Zuverlässigkeit und Wartbarkeit des Systems verbessert. Ob es darum geht, Mehrfachfahrten in einem Taxibuchungssystem zu verhindern oder gleichzeitige Druckaufträge zu verwalten, das Balking Pattern bietet einen strukturierten Ansatz zur Vermeidung von Konflikten und zur Aufrechterhaltung der betrieblichen Integrität. Letztendlich hängt die Entscheidung für die Verwendung des Balking-Musters von den spezifischen Anforderungen Ihrer Anwendung und ihren Parallelitätsanforderungen ab.
Das obige ist der detaillierte Inhalt vonParallelitätsmuster: Blockierungsmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!