服务
API服务
异步问题
01.Sanic是一个基于Python的异步web框架,它采用非阻塞的方式处理请求和响应
02.后台处理
1.解决异步问题有两种思路,
一种 是借助外部工具实现异步,例如:消息队列(RabbitMQ)、 异步任务队列(Celery+Redis);
另一种是借助Python中的进程、线程或协程解决异步。小项目选择因此选择了第二种方法。
1.1. 线程与进程的区别
线程:线程是进程内的轻量级执行单元,共享进程的内存空间,创建和切换的开销较小。 threading
进程:进程是独立的运行单元,拥有独立的内存空间,适合CPU密集型任务(通过 multiprocessing 模块实现)。
由于Python的全局解释器锁(GIL),threading 模块的线程无法实现真正的并行计算,但适合I/O密集型任务(如网络请求、文件读写)。
# 创建线程
t = threading.Thread(target=worker, args=(i,))
#启动线程。
t.start()
通过继承Thread类并重写run()方法定义线程任务 优势:便于封装复杂逻辑和状态管理。
1.2.Python 的 queue 模块 添加任务和参数。
使用 put() 方法将任务和参数一起放入队列
class queue.Queue(maxsize=0)
threading 结合queue.Queue 使用队列管理任务分配,避免手动管理线程
1.3 Sanic中结合使用threading模块来执行后台任务
异步任务队列:
将长运行的任务放入消息队列或任务队列中,由后台线程或分布式调度系统处理,实现请求与响应的分离
1.4 curl
curl -X POST http://10.10.10.10:1010/hello -d '{"id":"2","name":"7"}
通过 -X 或 --request 标志,可强制指定 HTTP 方法(如 POST、PUT 等)
1.5 可观测性 微服务的可观测性是指通过收集、分析和监控微服务架构中各个组件的数据来理解其行为和性能的能力
日志记录:记录任务的启动、运行和终止情况,便于问题排查
性能考虑:避免在任务中执行耗时操作而阻塞事件循环
通常会使用 trace、log 和 metric 这三个关键的监控数据类型
异步
工作队列和发布/订阅模式
使用threading和queue模块 这是最基本的方法,适合简单的场景,但不支持跨线程或多进程通信
对于需要跨进程通信的场景,可以使用multiprocessing模块
更复杂的应用,比如分布式系统,可以使用消息队列系统如Redis或RabbitMQ。这些系统提供了强大的消息队列和发布/订阅功能
参考
Flask使用线程异步执行耗时任务 https://blog.csdn.net/make_progress/article/details/134756301
https://docs.python.org/zh-cn/3.7/library/queue.html