Celery分布式任务队列

目录

  • [Celery 分布式任务队列:从原理到生产级实践](#Celery 分布式任务队列:从原理到生产级实践)
    • [1. 引言](#1. 引言)
    • [2. Celery 核心架构](#2. Celery 核心架构)
      • [2.1 什么是 Celery?](#2.1 什么是 Celery?)
      • [2.2 核心组件](#2.2 核心组件)
      • [2.3 任务生命周期](#2.3 任务生命周期)
    • [3. 快速入门](#3. 快速入门)
      • [3.1 环境准备](#3.1 环境准备)
      • [3.2 创建 Celery 应用](#3.2 创建 Celery 应用)
      • [3.3 启动 Worker](#3.3 启动 Worker)
      • [3.4 调用任务](#3.4 调用任务)
    • [4. 任务定义与调用进阶](#4. 任务定义与调用进阶)
      • [4.1 任务装饰器参数](#4.1 任务装饰器参数)
      • [4.2 任务调用方式](#4.2 任务调用方式)
      • [4.3 任务重试机制](#4.3 任务重试机制)
    • [5. 结果处理与状态跟踪](#5. 结果处理与状态跟踪)
      • [5.1 异步结果对象](#5.1 异步结果对象)
      • [5.2 任务状态回调](#5.2 任务状态回调)
    • [6. 定时任务(Celery Beat)](#6. 定时任务(Celery Beat))
      • [6.1 定义周期任务](#6.1 定义周期任务)
      • [6.2 启动 Beat 和 Worker](#6.2 启动 Beat 和 Worker)
      • [6.3 动态配置的定时任务](#6.3 动态配置的定时任务)
    • [7. 工作流编排](#7. 工作流编排)
    • [8. 任务路由与队列管理](#8. 任务路由与队列管理)
      • [8.1 根据业务场景划分队列](#8.1 根据业务场景划分队列)
      • [8.2 自定义任务路由器](#8.2 自定义任务路由器)
    • [9. 监控与管理](#9. 监控与管理)
      • [9.1 Flower ------ 实时 Web 监控](#9.1 Flower —— 实时 Web 监控)
      • [9.2 Worker 类型与选择](#9.2 Worker 类型与选择)
    • [10. 生产环境最佳实践](#10. 生产环境最佳实践)
      • [10.1 配置管理](#10.1 配置管理)
      • [10.2 任务设计原则](#10.2 任务设计原则)
      • [10.3 错误处理与重试](#10.3 错误处理与重试)
      • [10.4 部署架构](#10.4 部署架构)
      • [10.5 消息代理选型](#10.5 消息代理选型)
    • [11. 完整示例:电商订单异步处理](#11. 完整示例:电商订单异步处理)
      • [11.1 项目结构](#11.1 项目结构)
      • [11.2 Celery 应用配置](#11.2 Celery 应用配置)
      • [11.3 定义任务](#11.3 定义任务)
      • [11.4 工作流编排](#11.4 工作流编排)
      • [11.5 调用示例](#11.5 调用示例)
    • [12. 代码自查与总结](#12. 代码自查与总结)
      • [12.1 代码自查清单](#12.1 代码自查清单)
      • [12.2 常见问题与解决方案](#12.2 常见问题与解决方案)
    • [13. 总结](#13. 总结)

『宝藏代码胶囊开张啦!』------ 我的 CodeCapsule 来咯!✨写代码不再头疼!我的新站点 CodeCapsule 主打一个 "白菜价"+"量身定制 "!无论是卡脖子的毕设/课设/文献复现 ,需要灵光一现的算法改进 ,还是想给项目加个"外挂",这里都有便宜又好用的代码方案等你发现!低成本,高适配,助你轻松通关!速来围观 👉 CodeCapsule官网

Celery 分布式任务队列:从原理到生产级实践

1. 引言

在 Web 应用和分布式系统中,耗时操作 (如发送邮件、生成报表、调用第三方 API)若在请求-响应周期内同步执行,将严重影响用户体验和系统吞吐量。任务队列通过将任务异步化,实现了削峰填谷、资源错峰处理。

Celery 是 Python 生态中最成熟、最广泛使用的分布式任务队列。它支持实时任务调度和周期任务,可与多种消息中间件(RabbitMQ、Redis 等)集成,并提供任务状态追踪、错误重试、工作流编排等强大功能。据 PyPI 统计,Celery 月下载量超千万,是 Django、Flask 等框架异步任务的标配 。

本文将带您全面掌握 Celery,内容涵盖:

  • 核心架构:理解 Celery 的组件与工作流程
  • 快速入门:从零搭建第一个 Celery 应用
  • 进阶特性:任务定义、调用方式、结果处理
  • 任务调度:定时任务与周期任务实现
  • 工作流编排:使用 Canvas 原语构建复杂任务流
  • 监控与管理:Flower 可视化工具与最佳实践
  • 生产实践:队列划分、动态路由、Kubernetes 部署

2. Celery 核心架构

2.1 什么是 Celery?

Celery 是一个基于 Python 的分布式任务队列,专为处理大量异步任务而设计。它允许你将任务分配给多个工作节点,以便并行处理和分布式计算 。

Celery 本身并非完整的消息队列系统,而是抽象了消息队列架构中的 Producer、Consumer 实现,将消息队列中的基本单位"消息"抽象成了任务队列中的"任务",并将异步、定时任务的发起和结果存储等操作进行了封装 。
发布任务
消费任务
存储结果
获取结果
周期调度
客户端
Broker
Worker
Backend
Celery Beat

2.2 核心组件

Celery 由以下四个关键组件构成 :

组件 职责 常见实现
Broker(消息代理) 接收生产者发送的任务消息,存储在队列中等待 Worker 消费 RabbitMQ、Redis、Amazon SQS
Worker(任务执行者) 独立运行的进程,持续监听 Broker 中的队列,获取任务并执行 Celery Worker 进程
Backend(结果后端) 存储任务执行的状态和返回值(可选) Redis、RabbitMQ、数据库
Beat(任务调度器) 负责定时触发任务,将任务周期性发送到 Broker Celery Beat 进程

2.3 任务生命周期

任务在 Celery 中的执行流程可以分解为以下步骤 :

  1. 任务注册 :通过 @app.task 装饰器将普通函数注册为 Celery 任务
  2. 任务发送 :应用调用 delay()apply_async() 将任务发送到 Broker
  3. 任务存储:Broker 暂存任务消息,等待 Worker 消费
  4. 任务消费:Worker 从 Broker 拉取任务,反序列化并执行
  5. 结果存储:任务执行完成后,结果被存储到 Backend
  6. 结果获取:客户端通过任务 ID 查询执行状态和结果

3. 快速入门

3.1 环境准备

bash 复制代码
# 安装 Celery
pip install celery

# 安装 Redis(作为 Broker 和 Backend)
pip install redis

确保 Redis 服务已启动(可通过 Docker 快速启动):

bash 复制代码
docker run -d --name redis -p 6379:6379 redis:7-alpine

3.2 创建 Celery 应用

创建文件 tasks.py

python 复制代码
# tasks.py
from celery import Celery

# 创建 Celery 实例
app = Celery(
    'tasks',
    broker='redis://localhost:6379/0',
    backend='redis://localhost:6379/1'
)

# 定义任务
@app.task
def add(x, y):
    return x + y

3.3 启动 Worker

bash 复制代码
celery -A tasks worker --loglevel=info

参数说明 :

  • -A--app:指定 Celery 应用所在的模块
  • --loglevel:日志级别(INFO、DEBUG 等)

3.4 调用任务

在 Python 交互环境中:

python 复制代码
from tasks import add

# 异步调用任务
result = add.delay(4, 6)

# 检查任务状态
print(result.state)  # PENDING, SUCCESS, FAILURE

# 获取任务结果(阻塞等待)
print(result.get(timeout=1))  # 输出 10

至此,第一个分布式任务已成功执行 。

4. 任务定义与调用进阶

4.1 任务装饰器参数

@app.task 支持多种参数,用于精细化控制任务行为 :

python 复制代码
@app.task(
    bind=True,              # 绑定任务实例,self 可访问任务上下文
    name='tasks.add',       # 自定义任务名称
    max_retries=3,          # 最大重试次数
    default_retry_delay=5,  # 重试延迟(秒)
    rate_limit='10/s',      # 限速
    ignore_result=False,    # 是否忽略结果(节省后端存储)
    autoretry_for=(Exception,),  # 自动重试的异常类型
    retry_backoff=2          # 重试退避因子(指数退避)
)
def add(self, x, y):
    try:
        return x + y
    except Exception as exc:
        self.retry(exc=exc)  # 手动触发重试

4.2 任务调用方式

方法 描述 示例
delay(*args, **kwargs) 最简单异步调用 add.delay(1, 2)
apply_async(args, kwargs, ...) 完整参数控制 add.apply_async((1,2), countdown=10)
signature 任务签名,用于工作流 add.s(1, 2)

常用参数

  • countdown:延迟多少秒执行
  • eta:指定精确执行时间(datetime)
  • expires:过期时间,超时未执行则丢弃
  • queue:指定队列名,用于任务路由
  • priority:优先级(0-9,RabbitMQ 支持)
python 复制代码
# 延迟 10 秒执行
add.apply_async((2, 3), countdown=10)

# 指定执行时间
from datetime import datetime, timedelta
eta = datetime.utcnow() + timedelta(seconds=30)
add.apply_async((2, 3), eta=eta)

4.3 任务重试机制

Celery 提供了强大的重试支持,特别适用于网络不稳定或依赖外部服务的场景 :

python 复制代码
@app.task(bind=True, max_retries=3)
def send_email(self, recipient):
    try:
        # 模拟邮件发送失败
        raise ConnectionError("SMTP 不可达")
    except Exception as exc:
        # 使用指数退避重试
        self.retry(exc=exc, countdown=2 ** self.request.retries)

5. 结果处理与状态跟踪

5.1 异步结果对象

AsyncResult 提供了任务状态和结果查询 :

python 复制代码
from celery.result import AsyncResult

task = add.delay(1, 2)
task_id = task.id

# 在其他进程或后续时间点
result = AsyncResult(task_id, app=app)
print(result.state)      # PENDING, STARTED, SUCCESS, FAILURE, RETRY
print(result.successful())
print(result.result)     # 返回值或异常信息
print(result.traceback)  # 如果任务抛出异常,获取回溯信息

5.2 任务状态回调

可通过任务基类定义回调函数,实现任务成功、失败、重试时的自定义逻辑 :

python 复制代码
import celery

class MyTask(celery.Task):
    """自定义任务基类"""
    
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print(f'任务 {task_id} 失败: {exc}')
    
    def on_success(self, retval, task_id, args, kwargs):
        print(f'任务 {task_id} 成功: {retval}')
    
    def on_retry(self, exc, task_id, args, kwargs, einfo):
        print(f'任务 {task_id} 重试: {exc}')

@app.task(base=MyTask)
def sensitive_task():
    # 业务逻辑
    pass

6. 定时任务(Celery Beat)

Celery Beat 是周期性任务调度器。需同时启动 Beat 进程和 Worker 。

6.1 定义周期任务

python 复制代码
# celery_config.py
from celery.schedules import crontab

app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': 30.0,  # 每30秒
        'args': (16, 16)
    },
    'report-daily': {
        'task': 'tasks.generate_report',
        'schedule': crontab(hour=7, minute=30),  # 每天7:30
        'args': ('daily',)
    },
    'cleanup-weekly': {
        'task': 'tasks.cleanup',
        'schedule': crontab(day_of_week='monday', hour=2, minute=0),  # 每周一2:00
        'args': ()
    }
}

# 时区设置
app.conf.timezone = 'Asia/Shanghai'
app.conf.enable_utc = False

6.2 启动 Beat 和 Worker

bash 复制代码
# 终端1 - Worker
celery -A tasks worker --loglevel=info

# 终端2 - Beat
celery -A tasks beat --loglevel=info

# Linux 系统可将两者合并启动
celery -A tasks worker --beat --loglevel=info

6.3 动态配置的定时任务

对于需要动态调整定时任务的应用场景,可以使用数据库驱动的调度器。例如结合 Django ORM 的 djcelery.schedulers.DatabaseScheduler,可以在运行时通过管理界面增删改定时任务 。

7. 工作流编排

Celery 支持三种任务编排原语,称为 Canvas,可组合成复杂的工作流程 :

原语 描述 示意图
chain 链式执行,前一任务结果传递给后一任务 A → B → C
group 并行执行一组任务,返回结果列表 同时执行 A、B、C
chord group 完成后执行回调任务 (A,B,C) → D
python 复制代码
from celery import chain, group, chord

# chain 示例
res = chain(add.s(1, 2), add.s(3))()  # 等价于 add(add(1,2),3)
res.get()  # 6

# group 示例
g = group(add.s(i, i) for i in range(10))
result = g.apply_async()
print(result.get())  # [0,2,4,...,18]

# chord 示例
header = [add.s(i, i) for i in range(5)]
callback = add.s(100)  # 汇总后加上100
result = chord(header)(callback)
result.get()  # (0+2+4+6+8)+100 = 120

渲染错误: Mermaid 渲染失败: Parse error on line 4: ...on TB T1[add(0,0)] --> CB[add(?, ----------------------^ Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

这些原语在机器学习工作流、数据处理管道等场景中特别有用。例如,可以将数据预处理、模型推理、结果后处理组织为一个 chain,或将多个独立的数据分片任务并行执行 。

8. 任务路由与队列管理

8.1 根据业务场景划分队列

在生产环境中,应根据业务场景为任务分配不同的队列,避免不同类型任务互相阻塞 :

python 复制代码
# 配置文件中的路由规则
DEFAULT_CELERY_ROUTES = {
    'tasks.pending_create': {'queue': 'create'},
    'tasks.multi_create': {'queue': 'create'},
    'tasks.pull_tracking': {'queue': 'pull'},
    'tasks.pull_branch': {'queue': 'pull'},
    'tasks.push_tracking': {'queue': 'push'},
    'tasks.push_weight': {'queue': 'push'},
}

app.conf.task_routes = DEFAULT_CELERY_ROUTES

Worker 启动时指定消费哪些队列:

bash 复制代码
celery -A tasks worker -Q create,pull,push -l info

8.2 自定义任务路由器

如需根据任务参数动态决定队列(例如按用户 ID 或客户隔离),可实现自定义路由器 :

python 复制代码
class ClientRouter:
    """根据 client_id 动态路由任务到不同队列"""
    
    def route_for_task(self, task, args=None, kwargs=None):
        if task not in CLIENT_ROUTES:
            return None
        
        # 从 kwargs 中获取 client_id
        client_id = kwargs.get('client_id')
        if not client_id:
            return None
        
        # 生成隔离队列名
        queue_name = f"client_{client_id}_{task}"
        return {'queue': queue_name}

app.conf.task_routes = [ClientRouter(), DEFAULT_CELERY_ROUTES]

这种模式特别适合多租户系统,可以确保不同租户的任务相互隔离,一个租户的任务积压不会影响其他租户 。

9. 监控与管理

9.1 Flower ------ 实时 Web 监控

Flower 是 Celery 官方推荐的实时监控工具 :

bash 复制代码
pip install flower
celery -A tasks flower --port=5555

访问 http://localhost:5555 可查看:

  • Worker 在线状态
  • 任务执行历史
  • 队列长度
  • 任务图表与统计
  • 任务结果和异常信息

9.2 Worker 类型与选择

Celery 支持多种 Worker 类型,应根据任务特性选择合适的并发模型 :

类型 原理 适用场景 启动命令
solo 单线程顺序执行 需要严格串行的任务 --pool=solo
prefork 基于 multiprocessing 的多进程 CPU 密集型任务 --pool=prefork --concurrency=4
eventlet/gevent 基于协程(绿色线程) I/O 密集型任务 --pool=eventlet --concurrency=500

对于 I/O 密集型任务(如网络请求、数据库操作),使用 eventlet 或 gevent 可以大幅提升并发能力;对于 CPU 密集型任务(如数据处理、模型推理),prefork 是更合适的选择 。

10. 生产环境最佳实践

10.1 配置管理

将 Celery 配置与代码分离,便于环境切换 :

python 复制代码
# celery_config.py
broker_url = 'redis://:password@host:6379/0'
result_backend = 'redis://:password@host:6379/1'
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Asia/Shanghai'
enable_utc = False
task_track_started = True
task_time_limit = 30 * 60          # 任务硬超时(秒)
task_soft_time_limit = 20 * 60      # 任务软超时
task_acks_late = True               # 任务完成后再确认,保证至少一次执行
worker_prefetch_multiplier = 1      # 公平分发

10.2 任务设计原则

  • 任务应幂等:支持重复执行而不产生副作用,通过业务 ID 去重
  • 任务应小而专:单一职责,便于复用和组合
  • 避免任务内死循环:设置软/硬时间限制
  • 慎用 get() 同步等待:阻塞 Worker 线程,影响并发能力

10.3 错误处理与重试

python 复制代码
@app.task(bind=True, max_retries=5, retry_backoff=True)
def unreliable_task(self):
    try:
        # 可能失败的操作
        result = call_external_api()
        return result
    except requests.Timeout:
        # 网络超时,重试
        self.retry(countdown=60)
    except requests.HTTPError as e:
        if e.response.status_code >= 500:
            # 服务端错误,重试
            self.retry()
        else:
            # 客户端错误,不重试
            raise

10.4 部署架构

在生产环境中,Celery 常与容器化平台(如 Kubernetes)结合部署,实现弹性伸缩和高可用 :
任务提交
任务分发
任务分发
任务分发
结果存储
结果存储
结果存储
监控
监控
监控
根据队列长度伸缩
根据队列长度伸缩
FastAPI/Gunicorn
Redis
Celery Worker Pod
Celery Worker Pod
Celery Worker Pod
Flower 监控
HPA 自动伸缩

Kubernetes 的 Horizontal Pod Autoscaler 可以根据队列长度自动调整 Worker 数量,实现负载感知的弹性伸缩 。

10.5 消息代理选型

消息代理 优点 适用场景 配置复杂度
Redis 低延迟,简单配置,可同时作为 Backend 中小规模部署,快速起步
RabbitMQ 高可靠性,复杂路由,优先级队列 企业级生产环境,严格消息顺序要求
Kafka 极高吞吐量,持久化,流处理支持 大数据量、日志采集场景
Amazon SQS 全托管,自动扩展,无需运维 云原生部署,与 AWS 集成 极低

对于大多数 Python Web 项目,Redis 是平衡性能与复杂度的理想选择;随着规模扩大,可考虑迁移到 RabbitMQ 。

11. 完整示例:电商订单异步处理

本节实现一个电商系统中订单支付成功后的异步处理流程:发送邮件、扣减库存、增加积分,并生成工作流。

11.1 项目结构

复制代码
ecommerce/
├── celery_app.py      # Celery 应用配置
├── tasks.py           # 任务定义
├── workflows.py       # 工作流编排
└── client.py          # 调用示例

11.2 Celery 应用配置

python 复制代码
# celery_app.py
from celery import Celery

app = Celery('ecommerce')
app.config_from_object('celeryconfig')

# celeryconfig.py
broker_url = 'redis://localhost:6379/0'
result_backend = 'redis://localhost:6379/1'
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'Asia/Shanghai'
task_track_started = True
task_acks_late = True
worker_prefetch_multiplier = 1

# 导入任务模块
app.autodiscover_tasks(['tasks'])

11.3 定义任务

python 复制代码
# tasks.py
from celery_app import app
import time

@app.task(bind=True, max_retries=3)
def send_order_email(self, order_id, email):
    """发送订单邮件"""
    try:
        print(f"发送邮件至 {email},订单 {order_id}")
        # 模拟邮件服务调用
        time.sleep(1)
        return f"邮件已发送给 {email}"
    except Exception as exc:
        self.retry(exc=exc, countdown=60)

@app.task
def deduct_inventory(order_id, product_id, quantity):
    """扣减库存"""
    print(f"订单 {order_id} 扣减商品 {product_id} 库存 {quantity}")
    # 模拟数据库操作
    return True

@app.task
def add_points(user_id, points):
    """增加积分"""
    print(f"用户 {user_id} 增加积分 {points}")
    return points

@app.task
def order_success_cleanup(order_id):
    """订单成功后的清理工作"""
    print(f"订单 {order_id} 最终处理完成,清理临时数据")
    return True

11.4 工作流编排

python 复制代码
# workflows.py
from celery import chain, group, chord
from tasks import send_order_email, deduct_inventory, add_points, order_success_cleanup

def process_order_success(order_id, user_id, email, items, points):
    """
    订单成功后的异步处理流程:
    1. 发送邮件(独立)
    2. 批量扣减库存(并行)
    3. 增加积分(独立)
    4. 所有任务完成后执行清理
    """
    # 1. 发送邮件
    email_task = send_order_email.s(order_id, email)

    # 2. 扣减库存 - 每个商品一个子任务
    inventory_tasks = []
    for item in items:
        inv_task = deduct_inventory.s(order_id, item['product_id'], item['quantity'])
        inventory_tasks.append(inv_task)
    inventory_group = group(*inventory_tasks)

    # 3. 增加积分
    points_task = add_points.s(user_id, points)

    # 4. 使用 chord: 等待库存扣减组完成后执行清理
    cleanup_task = order_success_cleanup.s(order_id)
    workflow = chain(
        email_task,                 # 先发邮件
        chord(inventory_group)(cleanup_task),  # 库存扣减全部完成 → 清理
        points_task                 # 积分增加独立执行
    )

    return workflow.apply_async()

11.5 调用示例

python 复制代码
# client.py
from workflows import process_order_success

# 模拟请求
items = [
    {'product_id': 101, 'quantity': 2},
    {'product_id': 102, 'quantity': 1}
]
result = process_order_success(
    order_id=10001,
    user_id=888,
    email='customer@example.com',
    items=items,
    points=50
)
print(f"工作流任务 ID: {result.id}")

12. 代码自查与总结

12.1 代码自查清单

检查项 状态 说明
任务幂等性 库存扣减、积分增加均通过业务 ID 防重
异常处理 邮件任务加入重试机制,其他任务默认自动重试
连接池 Redis Broker/Backend 自动管理连接池
资源限制 配置了软/硬超时,防止僵尸任务
消息确认 task_acks_late=True,任务完成才确认
序列化 使用 JSON,跨语言友好
结果后端 仅存储必要结果,add_points 返回积分值
公平调度 worker_prefetch_multiplier=1 避免任务倾斜

12.2 常见问题与解决方案

问题 可能原因 解决方案
任务丢失 Worker 意外终止,消息未确认 启用 task_acks_late=True + 持久化 Broker
重复执行 网络分区导致重复确认 任务设计为幂等,使用业务流水号去重
内存泄漏 Worker 长时间运行 设置 --max-tasks-per-child=1000 定期重启子进程
任务积压 Worker 数量不足或消费慢 增加 Worker 并发数或实例数,优化任务性能
Windows 兼容问题 Celery 4.x 在 Windows 下的 bug 设置环境变量 FORKED_BY_MULTIPROCESSING=1 或使用 eventlet 池

13. 总结

Celery 以其灵活、可扩展的架构,成为 Python 分布式任务系统的首选。通过本文的学习,您应已掌握:

  • 核心组件:Broker、Worker、Backend、Beat 的角色与协作
  • 任务定义:从基础调用到重试、路由、工作流编排
  • 定时任务:Beat 调度与 crontab 表达式
  • 监控调优:Flower 可视化与性能参数配置
  • 生产实践:队列划分、自定义路由、Kubernetes 部署

Celery 不仅是一个任务队列,更是一个分布式计算框架。它能够将 Python 函数无缝扩展至数千台服务器,支撑每秒数万次的任务吞吐。从 Instagram 到 Mozilla,无数生产系统证明了 Celery 的可靠性与可扩展性 。

合理运用 Celery,将使您的系统具备弹性伸缩、高可用、易维护的优秀品质。无论您是在构建 Web 应用、数据处理管道还是机器学习推理服务,Celery 都是您工具箱中不可或缺的利器 。


结束语

异步化是应对高并发的银弹,而 Celery 是 Python 开发者手中最锋利的剑。愿你在分布式任务的海洋中,乘风破浪。

相关推荐
deephub1 小时前
深入RAG架构:分块策略、混合检索与重排序的工程实现
人工智能·python·大语言模型·rag
danyang_Q2 小时前
vscode python-u问题
开发语言·vscode·python
忘忧记2 小时前
python QT sqlsite版本 图书管理系统
开发语言·python·qt
长安牧笛2 小时前
车载模型白天晚上自动切换,自动切昼夜模型,颠覆统一模型,输出稳定识别。
python·编程语言
Katecat996632 小时前
【项目实践】基于YOLO11的币面缺陷检测与类型识别_FeaturePyramidSharedConv
python
ljxp12345682 小时前
二叉树最大深度算法解析
python
nix.gnehc2 小时前
在K8s集群中部署Traefik并验证Python HTTP服务
python·http·kubernetes
laplace01232 小时前
第二章 字符串和文本 下
服务器·数据库·python·mysql·agent
得一录2 小时前
VS Code创建虚拟环境指南
python