python: Bounded Parallelism Pattern

项目结构:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Bounded Parallelism  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/30 21:34
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : settings.py
 
 
 
"""
全局配置文件
遵循:配置与代码分离
"""
import os
 
# ====================== 核心并行配置 ======================
# 最大并发数(根据服务器/打印机/接口限制调整)
MAX_PARALLEL_TASKS = 10
 
# ====================== 业务配置 ======================
# 批量首饰数量
TOTAL_JEWELRY_COUNT = 20
# 宝石品类
GEM_TYPES = [
    "黄金", "铂金", "18K金", "钻石", "红宝石",
    "蓝宝石", "祖母绿", "珍珠", "翡翠", "银饰"
]
 
# ====================== 路径配置 ======================
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
LOG_DIR = os.path.join(BASE_DIR, "logs")
 
# 自动创建日志目录
os.makedirs(LOG_DIR, exist_ok=True)
 
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:15
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : concurrency.py
"""
并发工具类
封装:有界并行(Bounded Parallelism)核心实现
企业级通用,可复用于所有项目
"""
import time
import logging
from concurrent.futures import ThreadPoolExecutor
from threading import BoundedSemaphore
 
logger = logging.getLogger(__name__)
 
 
class BoundedParallelExecutor:
    """
    有界并行执行器
    严格限制最大并发数,保护系统资源
    """
 
    def __init__(self, max_parallel: int):
        self.max_parallel = max_parallel
        self.semaphore = BoundedSemaphore(max_parallel)
        logger.info(f"✅ 初始化有界并行器 | 最大并发任务数: {max_parallel}")
 
    def run_task(self, func, params_list: list, task_name: str = "任务"):
        """
        批量执行任务
        :param func: 任务函数
        :param params_list: 参数列表
        :param task_name: 任务名称(用于日志)
        :return: 执行结果列表
        """
        start_time = time.time()
        logger.info(f"🚀 开始执行【{task_name}】| 总任务数: {len(params_list)}")
 
        # 包装函数:注入信号量控制
        def wrapped_task(param):
            with self.semaphore:
                try:
                    return func(param)
                except Exception as e:
                    logger.error(f"❌ 【{task_name}】执行失败 | 参数: {param} | 错误: {str(e)}")
                    return None
 
        # 线程池执行
        with ThreadPoolExecutor(max_workers=self.max_parallel) as executor:
            results = list(executor.map(wrapped_task, params_list))
 
        # 统计耗时
        cost_time = time.time() - start_time
        success_count = len([r for r in results if r is not None])
        logger.info(
            f"🏁 【{task_name}】执行完成 | 成功: {success_count}/{len(params_list)} | 总耗时: {cost_time:.2f}s")
 
        return results
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:17
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : certificate.py
"""
珠宝鉴定证书生成任务
单一职责:只实现证书生成逻辑
"""
import time
import random
import logging
 
logger = logging.getLogger(__name__)
 
 
def generate_certificate(jewelry_id: int) -> str:
    """
    生成珠宝鉴定证书
    :param jewelry_id:
    :return:
    """
    logger.debug(f"[证书生成] 处理首饰编号: {jewelry_id}")
    time.sleep(random.uniform(0.5, 1.5))
    return f"证书_{jewelry_id}.pdf"
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:17
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : image.py
 
"""
珠宝图片处理任务
"""
import time
import random
import logging
 
logger = logging.getLogger(__name__)
 
 
def process_image(jewelry_id: int) -> str:
    """
    图片压缩 + 水印
    :param jewelry_id:
    :return:
    """
    logger.debug(f"[图片处理] 处理首饰编号: {jewelry_id}")
    time.sleep(random.uniform(0.3, 1.2))
    return f"压缩图_{jewelry_id}.jpg"
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:18
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : price.py
 
"""
金价/宝石价格同步任务
"""
import time
import random
import logging
 
logger = logging.getLogger(__name__)
 
 
def sync_gem_price(gem_type: str) -> dict:
    """
    同步宝石价格
    :param gem_type:
    :return:
    """
    logger.debug(f"[价格同步] 更新: {gem_type}")
    time.sleep(random.uniform(0.2, 0.8))
    price = round(random.uniform(300, 600), 2)
    return {gem_type: price}
 
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:18
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : barcode.py
 
"""
珠宝条码标签生成任务
"""
import time
import random
import logging
 
logger = logging.getLogger(__name__)
 
 
def generate_barcode(jewelry_id: int) -> str:
    """
    生成条码标签
    :param jewelry_id:
    :return:
    """
    logger.debug(f"[条码生成] 生成编号: {jewelry_id}")
    time.sleep(random.uniform(0.4, 1.0))
    return f"条码_{jewelry_id}.png"
 
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:19
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : jewelry_service.py
"""
珠宝业务核心服务
编排所有批量任务,对外提供统一调用入口
"""
import logging
from BoundedParallelismPattern.config.settings import MAX_PARALLEL_TASKS, TOTAL_JEWELRY_COUNT, GEM_TYPES
from BoundedParallelismPattern.utils.concurrency import BoundedParallelExecutor
from BoundedParallelismPattern.tasks import certificate, image, price, barcode
 
logger = logging.getLogger(__name__)
 
class JewelryBatchService:
    """
    珠宝全流程批量服务
    """
 
    def __init__(self):
        # 初始化有界并行器(全局唯一)
        self.executor = BoundedParallelExecutor(MAX_PARALLEL_TASKS)
        # 生成任务参数
        self.jewelry_ids = list(range(1, TOTAL_JEWELRY_COUNT + 1))
        self.gem_types = GEM_TYPES
 
    def run_all_batch_tasks(self):
        """执行所有批量任务(全业务流程)"""
        logger.info("=" * 60)
        logger.info("🏭 珠宝工厂企业级批量任务启动")
        logger.info("=" * 60)
 
        # 1. 鉴定证书
        self.executor.run_task(
            func=certificate.generate_certificate,
            params_list=self.jewelry_ids,
            task_name="珠宝鉴定证书生成"
        )
 
        # 2. 图片处理
        self.executor.run_task(
            func=image.process_image,
            params_list=self.jewelry_ids,
            task_name="珠宝图片压缩水印"
        )
 
        # 3. 价格同步
        self.executor.run_task(
            func=price.sync_gem_price,
            params_list=self.gem_types,
            task_name="全球宝石金价同步"
        )
 
        # 4. 条码标签
        self.executor.run_task(
            func=barcode.generate_barcode,
            params_list=self.jewelry_ids,
            task_name="珠宝条码标签生成"
        )
 
        logger.info("=" * 60)
        logger.info("✅ 珠宝全业务批量任务执行完成")
        logger.info("=" * 60)

调用:

python 复制代码
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:
# 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/30 22:20
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : BoundedParallelismBll.py
 
import logging
import os
import sys
from BoundedParallelismPattern.config.settings import LOG_DIR
from BoundedParallelismPattern.services.jewelry_service import JewelryBatchService
 
class BoundedParallelismBll(object):
    """
 
    """
    def demo(self):
        """
 
        :return:
        """
        # ====================== 全局日志配置 ======================
        logging.basicConfig(
            level=logging.INFO,
            format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
            datefmt="%Y-%m-%d %H:%M:%S",
            handlers=[
                logging.FileHandler(os.path.join(LOG_DIR, "jewelry_task.log"), encoding="utf-8"),
                logging.StreamHandler(sys.stdout)
            ]
        )
        logger = logging.getLogger(__name__)
        try:
            # 创建服务实例
            jewelry_service = JewelryBatchService()
            # 执行全流程任务
            jewelry_service.run_all_batch_tasks()
        except KeyboardInterrupt:
            logger.warning("⚠️ 用户手动终止任务")
            sys.exit(0)
        except Exception as e:
            logger.critical(f"💥 系统异常终止: {str(e)}", exc_info=True)
            sys.exit(1)

输出:

相关推荐
我爱cope1 小时前
【Agent智能体12 | 反思设计模式-使用外部反馈】
人工智能·设计模式·语言模型·职场和发展
.千余1 小时前
【Linux】 TCP进阶详解:字节流、粘包问题、异常情况与UDP完整对比2
linux·运维·c语言·开发语言·经验分享·笔记·php
大明者省1 小时前
Ubuntu Python 部署终极版教程
开发语言·python·ubuntu
光影少年1 小时前
Redux Toolkit 用法、解决原生Redux 冗余问题
开发语言·前端·javascript·react.js·中间件·前端框架·ecmascript
KANGBboy1 小时前
java知识二(数组)
java·开发语言·python
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第一章 Item 4 - 6)
android·数据库·论文阅读·python
零陵上将军_xdr1 小时前
后端转全栈学习-Day3-JavaScript 基础-1
开发语言·javascript·学习
llilay1 小时前
企业级FastAPI后端模板搭建(二)整合路由Router
开发语言·python·fastapi
scan7241 小时前
根据上下文中的用户信息,切换提示词
python