首页 后端开发 Python教程 并发模式:犹豫模式

并发模式:犹豫模式

Dec 28, 2024 am 12:13 AM

Concurrency Patterns: Balking Pattern

简介

犹豫设计模式是一种行为设计模式,用于管理系统中与状态相关的操作。它确保只有当系统处于适当的状态时才执行操作。如果不满足所需的先决条件,则操作将中止或系统“犹豫”。对于像我这样不知道什么是 Balking 的人来说,谷歌对此是这么说的:“犹豫或不愿意接受一个想法或承诺”。此模式在无效操作可能导致冲突或错误的多线程环境或系统中特别有用。

社区中的一些人还认为,犹豫模式更多的是一种反模式,而不是设计模式。如果一个对象不能支持它的 API,它应该限制 API 以使有问题的调用不可用,或者使调用可以不受限制地进行。这是一种古老的模式,似乎是在 JVM 速度较慢并且同步不像今天那样被充分理解和实现时出现的。不管怎样,它值得讨论,是否使用它取决于开发者。

犹豫模式依赖于三个基本概念

  1. 保护条件:操作继续进行必须满足的条件。
  2. 状态相关操作:依赖于系统当前状态的操作。
  3. 线程安全:该模式经常使用锁或其他同步机制来确保并发环境中的安全。

让我们通过一个例子来理解这些:

打印系统演示了犹豫模式:

  • 场景:一台打印机一次只能处理一个打印请求。即使多个进程可以发出打印请求。
  • Guard Condition:打印不得主动“打印”来处理新的打印请求。
  • 行为:如果打印机正忙,系统会犹豫不决,不会继续处理新的打印请求。

注意:是的,我们可以使用队列来处理这个问题,但我们现在假设我们不知道存在这样一个优雅的数据结构。

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()
登录后复制

查看代码我们可以看到,如果我们向打印机发送打印请求 start_printing 并且打印机正忙,它会检查它的当前状态 self.state,如果状态是“正在打印”,它将返回而不执行任何操作。否则,它将接受该请求并相应地调整其状态。

何时使用犹豫模式

  1. 多线程系统:防止竞争条件或无效操作。
  2. 与状态相关的工作流程:仅在某些状态下才允许执行操作。
  3. 资源管理:防止共享资源的不当使用。 使用这种模式的对象通常只处于一种容易暂时犹豫不决的状态,但持续时间未知。如果对象要在已知的有限时间内保持在容易停滞的状态,那么保护悬挂模式可能是首选。

犹豫模式的优点

  1. 防止无效操作:警卫确保操作仅在有效条件下发生。
  2. 线程安全:在多线程系统中特别有用。
  3. 简化逻辑:将状态相关的操作封装成清晰、可重用的模式。

缺点

  1. 有限的适用性:当操作是二进制的(允许或不允许)时最有用。
  2. 潜在开销:防护检查和同步机制可能会带来性能成本。

结论

犹豫设计模式提供了一种有效的方法来管理状态相关的操作并防止软件系统中的无效操作。通过引入明确的保护条件并保证线程安全,增强了系统的可靠性和可维护性。无论是防止出租车预订系统中的多次行程还是管理并发打印作业,Balking 模式都提供了一种结构化方法来避免冲突并保持操作完整性。最终,选择使用犹豫模式取决于应用程序的具体要求及其并发需求。

参考文献

  • 维基百科 - 犹豫模式
  • UCB

以上是并发模式:犹豫模式的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何解决Linux终端中查看Python版本时遇到的权限问题? 如何解决Linux终端中查看Python版本时遇到的权限问题? Apr 01, 2025 pm 05:09 PM

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? 如何在使用 Fiddler Everywhere 进行中间人读取时避免被浏览器检测到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere进行中间人读取时如何避免被检测到当你使用FiddlerEverywhere...

在Python中如何高效地将一个DataFrame的整列复制到另一个结构不同的DataFrame中? 在Python中如何高效地将一个DataFrame的整列复制到另一个结构不同的DataFrame中? Apr 01, 2025 pm 11:15 PM

在使用Python的pandas库时,如何在两个结构不同的DataFrame之间进行整列复制是一个常见的问题。假设我们有两个Dat...

Uvicorn是如何在没有serve_forever()的情况下持续监听HTTP请求的? Uvicorn是如何在没有serve_forever()的情况下持续监听HTTP请求的? Apr 01, 2025 pm 10:51 PM

Uvicorn是如何持续监听HTTP请求的?Uvicorn是一个基于ASGI的轻量级Web服务器,其核心功能之一便是监听HTTP请求并进�...

如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? 如何在10小时内通过项目和问题驱动的方式教计算机小白编程基础? Apr 02, 2025 am 07:18 AM

如何在10小时内教计算机小白编程基础?如果你只有10个小时来教计算机小白一些编程知识,你会选择教些什么�...

在Linux终端中使用python --version命令时如何解决权限问题? 在Linux终端中使用python --version命令时如何解决权限问题? Apr 02, 2025 am 06:36 AM

Linux终端中使用python...

如何绕过Investing.com的反爬虫机制获取新闻数据? 如何绕过Investing.com的反爬虫机制获取新闻数据? Apr 02, 2025 am 07:03 AM

攻克Investing.com的反爬虫策略许多人尝试爬取Investing.com(https://cn.investing.com/news/latest-news)的新闻数据时,常常�...

See all articles