在某些时间我们前端向服务端发送请求后,服务端后面的处理前端并不关心,这时服务端可以提前向前端反馈结果,自己的后端处理逻辑可以放后台处理。当然可以使用一些消息队列来实现例如RabbitMQ或Redis等消息/作业队列管理器。这里是直接基于程序去实现的方法,且目前很多种语言都已经实现类似的处理,python也不例外。python自3.4版本起标准库中引入了asyncio协程, python3.5中加入async/await特性,asyncio协程就可以实现后台任务。本文地址:http://www.04007.cn/article/948.html,未经许可,不得转载.
asyncio-异步 I/O 是python用来编写并发代码的库,被用作多个提供高性能Python异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等,asyncio是构建IO密集型和高层级结构化 网络代码的最佳选择。本文地址:http://www.04007.cn/article/948.html,未经许可,不得转载.
以下实现示例的环境是在fastapi框架中,分别使用asyncio和fastApi框架的BackgroundTasks实现。不过个人猜测fastApi框架的BackgroundTasks的底层也是使用的asyncio。使用asyncio实现后台任务的示例如下:本文地址:http://www.04007.cn/article/948.html,未经许可,不得转载.
import asyncio import time from loguru import logger # 后台任务 async def write_log(): for i in range(5): time.sleep(1) logger.info("show log") # 用户请求 @app.get("/asyncio/task") async def do_task(): asyncio.create_task(write_log())本文地址:http://www.04007.cn/article/948.html,未经许可,不得转载.
使用fastapi框架的BackgroundTasks实现后台任务示例如下:本文地址:http://www.04007.cn/article/948.html,未经许可,不得转载.
from fastapi import BackgroundTasks, FastAPI import time app = FastAPI() # 发送通知的后台任务 def write_notification(): for i in range(5): time.sleep(1) logger.info("send notification") # 前端用户请求 @app.post("/send-notification") async def send_notification(background_tasks: BackgroundTasks): background_tasks.add_task(write_notification) return {"message": "Notification sent in the background"}本文地址:http://www.04007.cn/article/948.html,未经许可,不得转载.
从结果可以看到,在浏览器向服务端请求完成并得到响应数据后,服务端还在持续打印日志,直到循环结束,即成功实现后台任务。本文地址:http://www.04007.cn/article/948.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/948.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |