You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用单线程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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:42:12