山东大学软件学院项目实训--PosterGenius--小宇宙(第五周)

目录

1.前言

2.为什么要异步处理

2.1 项目现状

2.2 异步处理的优点

3.celery深度解析

3.1 celery概述

3.2 celery配置

3.3 任务路由

3.4 任务定义

4.后记


1.前言

在构建PostGenius的过程中,我们面临着一个关键挑战:海报生成是一个计算密集型且耗时的过程。本文将深入探讨我们如何通过异步任务处理解决这一问题,并分享我们的技术实现方案。 

2.为什么要异步处理

2.1 项目现状

用户上传论文后,系统会自动生成美观的学术海报。这个过程中(已完成的部分)涉及多个耗时步骤:

  1. 论文内容分析与结构化处理

  2. 调用StyleEnhancer进行内容风格化

  3. 使用Real-ESRGAN进行图像增强

  4. 最终海报合成

我们测试发现一套流程下来,生成一张海报图片需要多达120秒到160秒的时间,效率低下会导致用户体验较差。

2.2 异步处理的优点

我们最终采用异步任务处理架构,主要基于以下考虑:

  1. 用户体验优化:用户提交请求后可以立即离开,稍后查看结果

  2. 系统稳定性:避免长时间运行的请求阻塞Web服务器

  3. 资源隔离:计算密集型任务与Web服务分离

  4. 可扩展性:可以轻松增加工作节点应对流量增长

3.celery深度解析

3.1 celery概述

Celery是一个分布式任务队列系统,其核心架构包含以下组件:

[Producer] → [Broker] ← [Worker]
               |
         [Result Backend]

producer是创建并发送任务的应用程序;broken是消息传输中间件;worker来执行任务的后台程序。

3.2 celery配置

from celery import Celery
import os

# 设置环境变量
os.environ.setdefault('CELERY_CONFIG_MODULE', 'worker.celeryconfig')

# 创建Celery实例
celery_app = Celery('postergenius')

# 从对象中加载配置
celery_app.config_from_object('worker.celeryconfig')

# 自动发现任务
celery_app.autodiscover_tasks(['worker.tasks'])

 

3.3 任务路由

# 任务路由
task_routes = {
    'worker.tasks.poster_tasks.*': {'queue': 'poster_queue'},
    'worker.tasks.image_tasks.*': {'queue': 'image_queue'},
}

3.4 任务定义

@celery_app.task(bind=True, name='worker.tasks.poster_tasks.generate_poster')
def generate_poster(self, title, abstract, authors, style, pdf_path=None):
    """
    生成学术海报的异步任务
    
    Args:
        self: Celery任务实例
        title: 论文标题
        abstract: 论文摘要
        authors: 作者信息
        style: 海报风格
        pdf_path: PDF文件路径(可选)
        
    Returns:
        dict: 包含生成海报的信息
    """
    # 更新任务状态为"处理中"
    self.update_state(state='PROCESSING', meta={'progress': 10, 'status': '正在处理内容...'})
    
    try:
        # 1. 处理内容
        style_enhancer = StyleEnhancer()
        content = style_enhancer.process(
            title=title,
            abstract=abstract,
            authors=authors,
            style=style,
            pdf_path=pdf_path
        )
        
        self.update_state(state='PROCESSING', meta={'progress': 40, 'status': '正在生成图像...'})
        
        # 2. 生成背景图像
        # 这里是图像生成的代码
        background_image_path = f"output/images/{self.request.id}_bg.png"
        
        self.update_state(state='PROCESSING', meta={'progress': 70, 'status': '正在增强图像质量...'})
        
        # 3. 使用Real-ESRGAN增强图像
        device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        model = RealESRGAN(device, scale=2)
        model_path = os.path.join(project_root, 'Real-ESRGAN-main', 'weights', 'RealESRGAN_x2.pth')
        model.load_weights(model_path)
        
        # 增强图像代码
        
        self.update_state(state='PROCESSING', meta={'progress': 90, 'status': '正在创建最终海报...'})
        
        # 4. 创建最终海报
        poster_path = f"output/posters/{self.request.id}.pdf"

这种架构不仅适用于我们的场景,也适用于任何包含耗时操作的Web应用。关键在于找到同步与异步的合理边界,并在用户体验和技术实现之间取得平衡。

未来我们将继续优化这套系统,比如引入优先级队列、实现更智能的任务调度等,让PostGenius能够更高效地服务我们的用户。

4.后记

黄河老师将持续更新该项目有趣好玩的点子和思路。对于一些整体框架的阐述改动,笔者尽可能在项目总述栏目中继续分享给大家。欢迎大家点个关注,持续学习、天天进步!你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦朋友们点个赞,收个藏呀~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值