如何在Flask的WSGIServer中启用/实现多线程
在WSGIServer中为Flask启用多线程以应对高负载
你的问题很典型——默认情况下,werkzeug的WSGIServer是单线程运行的,同一时间只能处理一个请求,高负载下请求排队堆积,自然就会导致响应变慢。好在启用多线程非常简单,只要给WSGIServer加个参数就行。
直接修改你的main函数,在初始化WSGIServer的时候添加threaded=True参数:
def main(): """Main entry point of the app.""" try: # 启用多线程模式,提升并发处理能力 http_server = WSGIServer(('0.0.0.0', 8084), app, log=logging, error_log=logging, threaded=True) http_server.serve_forever() except Exception as exc: logger.error(exc.message) logger.exception(traceback.format_exc()) finally: # 这里可以放置资源清理逻辑,比如关闭数据库连接、释放文件句柄等 pass
一些关键说明:
threaded=True会让WSGIServer启动多个工作线程来处理请求,这样就能同时响应多个用户的请求,缓解高负载下的排队问题。- 一定要注意线程安全!如果你的Flask应用里有全局变量、未加锁的共享资源操作(比如全局计数器、未同步的数据库连接),多线程环境下可能会出现数据竞争、结果不一致的问题。如果有这类代码,记得加锁(比如用
threading.Lock)或者重构为线程安全的实现。 - 如果后续负载进一步提升,多线程不够用的话,还可以考虑启用多进程(设置
processes=N参数,N为进程数),不过多线程已经能解决大部分中等规模的负载问题了。
另外提一句,生产环境中更推荐用Gunicorn、uWSGI这类专业的WSGI服务器,它们的并发管理、稳定性和性能都比自带的WSGIServer更强,但如果暂时想快速优化现有代码,上面的修改就能立竿见影。
内容的提问来源于stack exchange,提问作者Ali Raja
相关产品推荐
相关产品推荐

