事情本身不复杂,线索都在日志里。点击生成后等了一会儿页面提示错误,后端日志显示任务还在跑,结果却没有返回。
第一反应是「并发数太小,任务排队超时」,验证下来不成立。
把日志和配置对完,能解释这个现象的基本就这几处。长任务超过了默认的请求超时。还有一种是没有启用队列,请求被同步阻塞。
少数情况下是反向代理的读超时更短。
上来先启用队列并提高并发
demo.queue(max_size=32, default_concurrency_limit=4).launch()
随后在反向代理里放宽读超时
proxy_read_timeout 600s;
接着把耗时任务改成异步并返回任务 id
python -c "print('return task_id, poll status')"
等前面都确认过,再观察队列积压情况
python -c "print('check queue size')")
怎么算真的好了,看的是同一批现象。长任务能完整跑完并返回结果,页面不再中途报错,队列积压可见。
超时后后端往往还在继续计算,白白占用资源,最好在任务里加取消检查,避免用户重试导致重复计算。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。