python: Mutex Pattern

项目结构:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mutex Pattern 互斥锁模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/5/12 22:52
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : models.py
#
class Jewelry:
    """
    实体模型:职责单一
    """
    def __init__(self, name: str, stock: int):
        """
 
        :param name:
        :param stock:
        """
        self.name = name
        self.stock = stock
 

# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mutex Pattern 互斥锁模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/5/12 22:53
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : inventory.py
import threading
from MutexPattern.core.models import Jewelry
 
#
class ThreadSafeInventory:
    """
    全局线程安全库存(单例 + 互斥锁)
    """
    _instance = None
    _lock = threading.Lock()
 
    def __new__(cls):
        """
 
        """
        with cls._lock:
            if cls._instance is None:
                cls._instance = super().__new__(cls)
                cls._instance.jewelry = Jewelry("钻石", 0)
                cls._instance.mutex = threading.Lock()
            return cls._instance
 
    def get_stock(self):
        with self.mutex:
            return self.jewelry.stock
 
    def decrease_stock(self, count: int) -> bool:
        with self.mutex:
            if self.jewelry.stock >= count:
                self.jewelry.stock -= count
                return True
            return False
 
    def increase_stock(self, count: int):
        with self.mutex:
            self.jewelry.stock += count
python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mutex Pattern 互斥锁模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/5/12 22:56
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : sell_service.py
from MutexPattern.core.inventory import ThreadSafeInventory
 
class SellService:
    """
 
    """
    def __init__(self):
        self.inventory = ThreadSafeInventory()
 
    def sell(self, seller_name: str, count: int):
        success = self.inventory.decrease_stock(count)
        current = self.inventory.get_stock()
 
        if success:
            print(f"{seller_name} -> 销售{count}颗:销售成功 | 库存:{current}")
        else:
            print(f"{seller_name} -> 销售{count}颗:库存不足,无法销售 | 库存:{current}")
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mutex Pattern 互斥锁模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/5/12 22:58
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : stock_service.py
from MutexPattern.core.inventory import ThreadSafeInventory
 
class StockService:
    """
 
    """
    def __init__(self):
        self.inventory = ThreadSafeInventory()
 
    def restock(self, operator: str, count: int):
        self.inventory.increase_stock(count)
        current = self.inventory.get_stock()
        print(f"{operator} -> 补货{count}颗:补货成功 | 库存:{current}")

调用:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Mutex Pattern 互斥锁模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/5/12 22:58
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : MutexBll.py
import threading
from MutexPattern.service.sell_service import SellService
from MutexPattern.service.stock_service import StockService
 
class MutexBll(object):
    """
 
    """
    def demo(self):
        """
 
        :return:
        """
        sell_service = SellService()
        stock_service = StockService()
 
        # 并发任务(严格按你要求的顺序逻辑)
        threads = [
            threading.Thread(target=sell_service.sell, args=("销售员A", 1)),
            threading.Thread(target=sell_service.sell, args=("销售员B", 1)),
            threading.Thread(target=sell_service.sell, args=("销售员C", 1)),
            threading.Thread(target=stock_service.restock, args=("仓  库", 2)),
            threading.Thread(target=sell_service.sell, args=("销售员D", 1)),
        ]
 
        for t in threads:
            t.start()
        for t in threads:
            t.join()
 
        print("\n=== 所有并发任务执行完成 ===")
        print(f"最终库存:{sell_service.inventory.get_stock()}")

输出:

相关推荐
顾林海1 小时前
Agent入门阶段-编程基础-Python:流程控制
python·agent·ai编程
呱呱复呱呱4 小时前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽8 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码9 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱18 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵20 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate