能否用单线程Waitress实现请求优先级排序?
单线程Waitress实现请求优先级排序方案
Waitress单线程模式下本身是按请求到达顺序处理的,它没有内置的优先级调度能力,但你可以在应用层自己实现优先级队列逻辑,绕开Waitress的默认处理顺序,具体方案如下:
在应用内部维护带优先级的任务队列
用Python内置的queue.PriorityQueue(或heapq)存储请求任务,每个任务包含优先级数值(比如数字越小优先级越高)、推理处理函数、请求参数等信息。修改API接口为异步入队模式
把原来的同步推理接口改成接收请求后直接将任务加入优先级队列,然后立即返回"请求已排队"类的响应,避免请求在Waitress的默认队列里等待。启动单线程后台任务处理器
单独开一个后台线程,专门从优先级队列中按优先级取出任务执行模型推理。因为推理逻辑始终在单线程中运行,不会触发多线程导致的模型失效问题。
以下是基于Flask的极简示例代码:
from flask import Flask, request, jsonify from queue import PriorityQueue import threading import time app = Flask(__name__) task_queue = PriorityQueue() # 单线程后台任务处理函数 def task_worker(): while True: priority, infer_func, args = task_queue.get() try: infer_func(*args) except Exception as e: print(f"任务处理失败: {str(e)}") task_queue.task_done() # 启动后台线程(守护线程随主进程退出) threading.Thread(target=task_worker, daemon=True).start() # 模拟你的模型推理逻辑 def run_model_inference(req_data): print(f"正在处理优先级{priority}的请求: {req_data}") # 这里替换为实际的模型推理代码 time.sleep(2) @app.route('/api/infer', methods=['POST']) def api_infer(): req_json = request.get_json() # 从请求中获取优先级,默认设为5(数值越小优先级越高) priority = req_json.get('priority', 5) # 将任务加入优先级队列 task_queue.put( (priority, run_model_inference, (req_json,)) ) return jsonify({"status": "已加入队列", "priority": priority}) if __name__ == '__main__': from waitress import serve # 保持单线程启动Waitress serve(app, host='0.0.0.0', port=8000, threads=1)
- 额外注意点
- 如果需要给客户端返回推理结果,建议搭配WebSocket或客户端轮询接口实现,因为原接口是异步返回排队状态,无法直接同步返回推理结果。
- 可以给队列设置最大长度,当队列满时返回"系统繁忙,请稍后重试"的提示,避免内存溢出。
内容的提问来源于stack exchange,提问作者Høax
相关产品推荐
相关产品推荐

