Einführung
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.
Das Balking Pattern basiert auf drei grundlegenden Konzepten
- Schutzbedingung: Eine Bedingung, die erfüllt sein muss, damit ein Vorgang fortgesetzt werden kann.
- Zustandsabhängige Aktionen: Vorgänge, die vom aktuellen Zustand des Systems abhängen.
- Thread-Sicherheit: Das Muster verwendet häufig Sperren oder andere Synchronisierungsmechanismen, um die Sicherheit in gleichzeitigen Umgebungen zu gewährleisten.
Lassen Sie uns diese anhand eines Beispiels verstehen:
Ein Drucksystem demonstriert das Balking-Muster:
- Szenario: Ein Drucker kann jeweils nur eine Druckanfrage bearbeiten. Auch wenn mehrere Prozesse die Druckanforderung stellen können.
- Schutzbedingung: Der Drucker darf nicht aktiv „drucken“, um eine neue Druckanforderung zu verarbeiten.
- Verhalten: Wenn der Drucker ausgelastet ist, schreckt das System zurück und führt die neuen Druckanforderungen nicht aus.
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.
Wann sollte das Balking-Muster verwendet werden?
- Multithread-Systeme: Um Race Conditions oder ungültige Vorgänge zu verhindern.
- Zustandsabhängige Arbeitsabläufe: Wenn Aktionen nur in bestimmten Zuständen zulässig sind.
- Ressourcenmanagement: Zum Schutz vor Missbrauch gemeinsam genutzter Ressourcen. Objekte, die dieses Muster verwenden, befinden sich im Allgemeinen nur in einem Zustand, der dazu neigt, vorübergehend, aber für eine unbekannte Zeitspanne, zu blockieren. Wenn Objekte für einen bekannten, endlichen Zeitraum in einem Zustand verbleiben sollen, der zum Blockieren neigt, ist möglicherweise das geschützte Aufhängungsmuster zu bevorzugen.
Vorteile des Balking-Musters
- Verhindert ungültige Vorgänge: Wachen stellen sicher, dass Vorgänge nur unter gültigen Bedingungen stattfinden.
- Thread-Sicherheit: Besonders nützlich in Multithread-Systemen.
- Vereinfacht die Logik: Fasst zustandsabhängige Aktionen in einem klaren, wiederverwendbaren Muster zusammen.
Nachteile
- Eingeschränkte Anwendbarkeit: Am nützlichsten, wenn Aktionen binär sind (erlaubt oder nicht erlaubt).
- Potenzieller Overhead: Schutzprüfungen und Synchronisierungsmechanismen können zu Leistungseinbußen führen.
Fazit
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.
Referenzen
- Wikipedia – Verhaltensmuster
- UCB
Das obige ist der detaillierte Inhalt vonParallelitätsmuster: Blockierungsmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

In dem Artikel wird die in Version 3.10 eingeführte "Match" -serklärung von Python erörtert, die als Äquivalent zum Wechseln von Aussagen in anderen Sprachen dient. Es verbessert die Code-Lesbarkeit und bietet Leistungsvorteile gegenüber herkömmlichen IF-ELIF-EL

Ausnahmegruppen in Python 3.11 ermöglichen die gleichzeitige Behandlung mehrerer Ausnahmen, wodurch die Fehlermanagement in gleichzeitigen Szenarien und komplexen Vorgängen verbessert wird.

Funktionsanmerkungen in Python Fügen Sie Metadaten zu Funktionen für Typprüfungen, Dokumentation und IDE -Unterstützung hinzu. Sie verbessern die Lesbarkeit, die Wartung der Code und die API -Entwicklung, die Datenwissenschaft und die Erstellung der Bibliothek von entscheidender Bedeutung.

In dem Artikel werden Unit -Tests in Python, deren Vorteile und wie man sie effektiv schreibt, erläutert. Es zeigt Werkzeuge wie Unittest und PyTest zum Testen.

In Artikel werden Zugriffsspezifizierer in Python erörtert, die benennende Konventionen verwenden, um die Sichtbarkeit von Klassenmitgliedern und nicht die strenge Durchsetzung anzuzeigen.

In Artikel wird die Methode von Python \ _ \ _ init \ _ \ _ () und die Rolle von Self bei der Initialisierung von Objektattributen erörtert. Andere Klassenmethoden und die Auswirkungen der Vererbung auf \ _ \ _ init \ _ \ _ () sind ebenfalls abgedeckt.

In dem Artikel werden die Unterschiede zwischen @ClassMethod, @StaticMethod und Instance -Methoden in Python erörtert und ihre Eigenschaften, Anwendungsfälle und Vorteile beschrieben. Es wird erläutert, wie Sie den richtigen Methodentyp basierend auf der erforderlichen Funktionalität und DA auswählen

Inpython, youAppendElementStoAlistusedtheAppend () Methode.1) UseAppend () ForsingleElelements: my_list.append (4) .2) usextend () oder = formulnElements: my_list.extend (andere_list) ormy_list = [4,5,6] .3) useInSert () FORSPECIFIFICISPositionen: my_list.insert (1,5) .Beaware


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.
