2024年7月2日 14:35 by wst
异步处理好久不用sanic了,今天看官方文档,竟然有一个这么好用的功能:异步任务处理。
具体代码如下,待会给出解释,运行方法:sanic back_task
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@文件 :back_task.py
@说明 :测试异步后台任务
@时间 :2024/07/02 11:01:29
@作者 :wanshitao
@版本 :1.0
'''
import asyncio
from sanic import Sanic
from sanic.response import text
app = Sanic("BackTask")
app.config.DB_NAME = 'appdb'
async def notify_server_started_after_five_second():
"往当前事件循环中加入 后台任务 "
await asyncio.sleep(5)
print("Server successfully started!")
app.add_task(notify_server_started_after_five_second)
async def auto_inject(app):
await asyncio.sleep(5)
print(app.name, "with app. auto")
app.add_task(auto_inject)
async def explicit_inject(app):
await asyncio.sleep(30)
# 测试读取app中的内容
print(app.name, "explicit show.", app.config.DB_NAME)
app.add_task(explicit_inject(app))
解释:
第一个异步任务是睡眠5s打印一句话;后面两个类似。
用途:
这样可以实现异步任务处理了。
比如用户上传了一个大文件,需要很长时间处理完,此时可以抛出一个响应,然后生成一个异步任务慢慢处理这个文件。
再比如用户打开了付款页面,不知道付款成功没有。此时可以生成一个异步任务,30分钟后检测用户的支付状态。
------------------------------------------
想想之前,这些功能都是怎么实现的:
1. 启动celery服务;
2. 抛出任务给celery;
3. 检查任务执行结果;
而现在一个框架里就可以实现了。喜大普奔!