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 分钟前
理解Java反射机制和内省机制应用与实践
java·开发语言·反射
专注VB编程开发20年3 分钟前
python翻译网页HTML的难题
python·c#·html
new【一个】对象20 分钟前
登录与注册完整流程分析
python
尤老师FPGA28 分钟前
QT代码自适应窗口
开发语言·qt
biter down31 分钟前
5:原生 assert 断言
开发语言
布朗克16831 分钟前
12 封装与构造方法
java·开发语言·封装·构造方法
仙俊红32 分钟前
线程池面试
python·面试·职场和发展
z落落42 分钟前
C# 抽象类(abstract)
java·开发语言·c#
折哥的程序人生 · 物流技术专研1 小时前
AI 编程与行业赋能|专栏总目录(持续更新)
开发语言·人工智能·软件工程·ai编程
SilentSamsara1 小时前
爬虫工程化:Playwright + 反反爬 + 数据清洗管道实战
开发语言·爬虫·python·青少年编程·playwright