Heim >Backend-Entwicklung >Python-Tutorial >Parallelitätsmuster: Blockierungsmuster

Parallelitätsmuster: Blockierungsmuster

Patricia Arquette
Patricia ArquetteOriginal
2024-12-28 00:13:11508Durchsuche

Concurrency Patterns: Balking Pattern

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

  1. Schutzbedingung: Eine Bedingung, die erfüllt sein muss, damit ein Vorgang fortgesetzt werden kann.
  2. Zustandsabhängige Aktionen: Vorgänge, die vom aktuellen Zustand des Systems abhängen.
  3. 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?

  1. Multithread-Systeme: Um Race Conditions oder ungültige Vorgänge zu verhindern.
  2. Zustandsabhängige Arbeitsabläufe: Wenn Aktionen nur in bestimmten Zuständen zulässig sind.
  3. 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

  1. Verhindert ungültige Vorgänge: Wachen stellen sicher, dass Vorgänge nur unter gültigen Bedingungen stattfinden.
  2. Thread-Sicherheit: Besonders nützlich in Multithread-Systemen.
  3. Vereinfacht die Logik: Fasst zustandsabhängige Aktionen in einem klaren, wiederverwendbaren Muster zusammen.

Nachteile

  1. Eingeschränkte Anwendbarkeit: Am nützlichsten, wenn Aktionen binär sind (erlaubt oder nicht erlaubt).
  2. 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn