事情本身不复杂,线索都在日志里。点击生成后等了一会儿页面提示错误,后端日志显示任务还在跑,结果却没有返回。

第一反应是「并发数太小,任务排队超时」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。长任务超过了默认的请求超时。还有一种是没有启用队列,请求被同步阻塞。

少数情况下是反向代理的读超时更短。

上来先启用队列并提高并发

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')")

怎么算真的好了,看的是同一批现象。长任务能完整跑完并返回结果,页面不再中途报错,队列积压可见。

超时后后端往往还在继续计算,白白占用资源,最好在任务里加取消检查,避免用户重试导致重复计算。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189