目录
1.前言
在构建PostGenius的过程中,我们面临着一个关键挑战:海报生成是一个计算密集型且耗时的过程。本文将深入探讨我们如何通过异步任务处理解决这一问题,并分享我们的技术实现方案。
2.为什么要异步处理
2.1 项目现状
用户上传论文后,系统会自动生成美观的学术海报。这个过程中(已完成的部分)涉及多个耗时步骤:
-
论文内容分析与结构化处理
-
调用StyleEnhancer进行内容风格化
-
使用Real-ESRGAN进行图像增强
-
最终海报合成
我们测试发现一套流程下来,生成一张海报图片需要多达120秒到160秒的时间,效率低下会导致用户体验较差。
2.2 异步处理的优点
我们最终采用异步任务处理架构,主要基于以下考虑:
-
用户体验优化:用户提交请求后可以立即离开,稍后查看结果
-
系统稳定性:避免长时间运行的请求阻塞Web服务器
-
资源隔离:计算密集型任务与Web服务分离
-
可扩展性:可以轻松增加工作节点应对流量增长
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.后记
黄河老师将持续更新该项目有趣好玩的点子和思路。对于一些整体框架的阐述改动,笔者尽可能在项目总述栏目中继续分享给大家。欢迎大家点个关注,持续学习、天天进步!你的点赞就是我更新的动力,如果觉得对你有帮助,辛苦朋友们点个赞,收个藏呀~~~