python: Bounded Parallelism Pattern

项目结构:

image

 

# 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)

  

调用:

# 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)

  

输出:

image

 

posted @ 2026-05-30 23:13  ®Geovin Du Dream Park™  阅读(5)  评论(0)    收藏  举报