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

输出:

相关推荐
Cc.Y2 分钟前
Java零基础入门:类与对象深度掌握 —— 从“零散变量“到“打包管理“
java·开发语言·python
\光辉岁月/4 分钟前
2.java变量
java·开发语言·变量
AINative软件工程13 分钟前
LLM Prompt Registry 工程实践:集中管理 Prompt,让模型调用不再散落在代码各处
后端·python·llm
夏天的清晨19 分钟前
C++入门学习
开发语言·c++·学习
Patrick在香港20 分钟前
MCP 的 initialize 握手真的没了?67 行标准库实测 2026-07-28 规范
python·agent·claude·mcp·json-rpc
新鲜势力呀23 分钟前
PHP 文件上传系统实战:从上传卡顿到分片上传 + 秒传 + 云存储架构完整优化方案
开发语言·架构·php
vx_Biye_Design23 分钟前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
追烽少年x26 分钟前
从零构建一个3D点云预览器:Python + PySide6 + pyqtgraph 实战
python·3d
程序员老陆39 分钟前
从语法糖到类型系统:深度拆解 C++ Lambda 与可调用对象的“血缘关系”
开发语言·c++·程序设计
weixin_4404016939 分钟前
质朴的爬虫+数据处理
爬虫·python·数据分析·pandas