recherche
Maisondéveloppement back-endTutoriel PythonModèles de concurrence : modèle de hésitation

Concurrency Patterns: Balking Pattern

Présentation

Le Balking Design Pattern est un modèle de conception comportemental utilisé pour gérer les actions dépendant de l'état dans un système. Il garantit que les opérations sont exécutées uniquement lorsque le système est dans un état approprié. Si la condition préalable requise n'est pas remplie, l'opération est interrompue ou le système "rechigne". Pour ceux comme moi, qui ne savent pas ce qu'est Balking, voici ce que Google a à dire à ce sujet : "hésiter ou ne pas vouloir accepter une idée ou un engagement". Ce modèle est particulièrement utile dans les environnements ou systèmes multithread où des actions non valides pourraient provoquer des conflits ou des erreurs.

Le modèle de refus est également considéré davantage comme un anti-modèle que comme un modèle de conception par certaines personnes de la communauté. Si un objet ne peut pas prendre en charge son API, il doit soit limiter l'API afin que l'appel incriminé ne soit pas disponible, soit pour que l'appel puisse être effectué sans limitation. Il s'agit d'un ancien modèle qui semble être apparu lorsque les JVM étaient plus lentes et que la synchronisation n'était pas aussi bien comprise et mise en œuvre qu'elle l'est aujourd'hui. Quoi qu'il en soit, cela vaut la peine d'en discuter et c'est aux développeurs de décider de l'utiliser ou non.

Le Balking Pattern repose sur trois concepts fondamentaux

  1. Condition de garde : Une condition qui doit être remplie pour qu'une opération puisse se dérouler.
  2. Actions dépendantes de l'état : opérations qui dépendent de l'état actuel du système.
  3. Thread Safety : le modèle utilise souvent des verrous ou d'autres mécanismes de synchronisation pour garantir la sécurité dans des environnements concurrents.

Comprenons cela avec un exemple :

Un système d'impression démontre le modèle Balking :

  • Scénario : Une imprimante ne peut traiter qu'une seule demande d'impression à la fois. Même si plusieurs processus peuvent passer la demande d'impression.
  • Condition de garde : L'impression ne doit pas être activement « en cours d'impression » pour traiter une nouvelle demande d'impression.
  • Comportement : Si l'imprimante est occupée, le système rechigne et ne donne pas suite aux nouvelles demandes d'impression.

Remarque : Oui, nous pouvons gérer cela en utilisant une file d'attente, mais supposons pour l'instant que nous ne savons pas qu'une structure de données aussi élégante existe.

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()

En regardant le code, nous pouvons voir que si nous envoyons une demande d'impression start_printing à l'imprimante et que l'imprimante est occupée, elle vérifiera son état actuel self.state et si l'état est "en cours d'impression", elle reviendra sans rien faire. . Sinon, il prendra en compte cette demande et ajustera son état en conséquence.

Quand utiliser le modèle de reticulation

  1. Systèmes multithread : pour éviter les conditions de concurrence ou les opérations invalides.
  2. Flux de travail dépendants de l'État : lorsque les actions ne sont autorisées que dans certains États.
  3. Gestion des ressources : Pour se prémunir contre une utilisation inappropriée des ressources partagées. Les objets qui utilisent ce modèle ne sont généralement que dans un état susceptible de rechigner temporairement, mais pour une durée inconnue. Si les objets doivent rester dans un état susceptible de rechigner pendant une période de temps connue et finie, alors le modèle de suspension gardée peut être préféré.

Avantages du modèle Balking

  1. Empêche les opérations invalides : les gardes garantissent que les opérations se déroulent uniquement dans des conditions valides.
  2. Thread Safety : Particulièrement utile dans les systèmes multithread.
  3. Simplifie la logique : encapsule les actions dépendant de l'état dans un modèle clair et réutilisable.

Inconvénients

  1. Applicabilité limitée : très utile lorsque les actions sont binaires (autorisées ou non).
  2. Surcharge potentielle : les contrôles de sécurité et les mécanismes de synchronisation peuvent introduire des coûts de performances.

Conclusion

Le Balking Design Pattern fournit un moyen efficace de gérer les actions dépendant de l'état et d'empêcher les opérations non valides dans les systèmes logiciels. En introduisant des conditions de protection claires et en garantissant la sécurité des threads, il améliore la fiabilité et la maintenabilité du système. Qu'il s'agisse d'empêcher plusieurs trajets dans un système de réservation de taxi ou de gérer des travaux d'impression simultanés, Balking Pattern offre une approche structurée pour éviter les conflits et maintenir l'intégrité opérationnelle. En fin de compte, le choix d'utiliser le Balking Pattern dépend des exigences spécifiques de votre application et de ses besoins de concurrence.

Références

  • Wikipédia - Modèle de rechute
  • UCB

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Comment trancher un tableau Python?Comment trancher un tableau Python?May 01, 2025 am 12:18 AM

La syntaxe de base pour le découpage de la liste Python est la liste [Démarrage: arrêt: étape]. 1.Start est le premier index d'élément inclus, 2.STOP est le premier indice d'élément exclu et 3.StEP détermine la taille de l'étape entre les éléments. Les tranches sont non seulement utilisées pour extraire les données, mais aussi pour modifier et inverser les listes.

Dans quelles circonstances les listes pourraient-elles mieux fonctionner que les tableaux?Dans quelles circonstances les listes pourraient-elles mieux fonctionner que les tableaux?May 01, 2025 am 12:06 AM

ListesoutPerformarRaySin: 1) dynamicingizingandfrequentinSertions / Deletions, 2) StoringheteroGeneousData, and3) MemoryEfficiencyForsparsedata, butmayhaveslightperformanceCostSincertorations.

Comment pouvez-vous convertir un tableau Python en une liste Python?Comment pouvez-vous convertir un tableau Python en une liste Python?May 01, 2025 am 12:05 AM

Toconvertapythonarraytoalist, usethelist () Constructororageneratorexpression.1) ImportTheArrayModuleandCreateArray.2) Uselist (Arr) ou [Xforxinarr] à Convertittoalist, considérant la performance et le domaine de l'émie-efficacité pour les étages.

Quel est le but d'utiliser des tableaux lorsque des listes existent dans Python?Quel est le but d'utiliser des tableaux lorsque des listes existent dans Python?May 01, 2025 am 12:04 AM

ChooseArraySoverListsInpyThonforBetterperformanceAndmemeMoryEfficacitéInSpecificScenarios.1) LargenumericalDatasets: ArraySreduceDeMemoryUsage.2)

Expliquez comment itérer les éléments d'une liste et un tableau.Expliquez comment itérer les éléments d'une liste et un tableau.May 01, 2025 am 12:01 AM

Dans Python, vous pouvez utiliser pour les boucles, énumérer et les compréhensions de liste pour traverser les listes; En Java, vous pouvez utiliser des boucles traditionnelles et améliorées pour les boucles pour traverser les tableaux. 1. Les méthodes de traversée de la liste Python incluent: pour la compréhension de la boucle, de l'énumération et de la liste. 2. Les méthodes de traversée du tableau Java comprennent: traditionnel pour la boucle et amélioré pour la boucle.

Qu'est-ce que la déclaration de commutation Python?Qu'est-ce que la déclaration de commutation Python?Apr 30, 2025 pm 02:08 PM

L'article traite de la nouvelle instruction "Match" de Python introduite dans la version 3.10, qui constitue un équivalent pour les instructions de commutation dans d'autres langues. Il améliore la lisibilité du code et offre des avantages de performance par rapport aux if-elif-el traditionnels

Que sont les groupes d'exception à Python?Que sont les groupes d'exception à Python?Apr 30, 2025 pm 02:07 PM

Les groupes d'exception dans Python 3.11 permettent de gérer plusieurs exceptions simultanément, améliorant la gestion des erreurs dans des scénarios simultanés et des opérations complexes.

Que sont les annotations de fonction dans Python?Que sont les annotations de fonction dans Python?Apr 30, 2025 pm 02:06 PM

Les annotations de fonction dans Python ajoutent des métadonnées aux fonctions pour la vérification de type, la documentation et la prise en charge de l'IDE. Ils améliorent la lisibilité du code, la maintenance et sont cruciaux dans le développement de l'API, la science des données et la création de bibliothèques.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Version crackée d'EditPlus en chinois

Version crackée d'EditPlus en chinois

Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel

Listes Sec

Listes Sec

SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

Navigateur d'examen sécurisé

Navigateur d'examen sécurisé

Safe Exam Browser est un environnement de navigation sécurisé permettant de passer des examens en ligne en toute sécurité. Ce logiciel transforme n'importe quel ordinateur en poste de travail sécurisé. Il contrôle l'accès à n'importe quel utilitaire et empêche les étudiants d'utiliser des ressources non autorisées.

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP