使用threaded=True实现同时处理Flask请求

89

threaded = True 传递给 app.run() 到底是做什么的?

我的应用程序从用户那里处理输入,并需要一些时间来完成此操作。在此期间,该应用程序无法处理其他请求。我已经测试了 threaded=True 的应用程序,并且它允许我同时处理多个请求。

2个回答

116
自 Flask 1.0 起,默认情况下,Flask 自带的 WSGI 服务器以线程模式运行。在 1.0 之前或禁用线程时,服务器以单线程模式运行,每次只能处理一个请求。任何并行请求都必须等待处理,如果您尝试从请求中联系自己的服务器可能会出现问题。使用 threaded=True,每个请求都在新线程中处理。您的服务器可以同时处理多少个线程完全取决于您的操作系统以及它对每个进程的线程数限制。该实现使用 SocketServer.ThreadingMixIn,它不对它可以启动的线程数设置任何限制。
请注意,Flask服务器仅用于开发。它不是生产就绪的服务器。不要依赖它来在更广泛的网络上运行您的网站。请使用适当的WSGI服务器(例如gunicornuWSGI)。

3
只有我办公室里的几个人会使用我的应用程序,保持这种状态是否可以? - Harrison
8
好的,那没问题,除非那些人有可能会尝试黑掉或攻击你的机器。 - Martijn Pieters
1
我完全信任他们。多个人同时使用该应用程序的可能性相对较小,因此我认为现在只需在Flask服务器上保持运行即可。您认为何时使用gunicorn部署是一个好决定? - Harrison
3
当你想将其开放到更广泛的互联网上或者你感觉需要更好地控制服务器使用多少资源时,一个专用的 WSGI 服务器可以控制并发数量,并使用多个进程来分配负载。 - Martijn Pieters
2
@variable: 不,那不正确。Flask是一个WSGI框架,并且并发处理方式取决于WSGI服务器。Flask确实带有开发服务器以方便使用,该服务器使用单个进程和线程,但这不是唯一的选择,当您在其他地方时,您真正想要使用适当的生产级部署。 - Martijn Pieters
显示剩余7条评论

10

使用此语句,我的应用程序能同时处理多少个请求?

这取决于您的应用程序。每个新请求都会启动一个线程- 这取决于您的计算机可以处理多少个线程。我没有看到限制线程数量的选项(例如uwsgi在生产部署中提供的选项)。

使用它有什么缺点?如果我不期望大量并发请求,我可以继续使用它吗?

从单线程切换到多线程可能会导致并发错误... 如果您使用此功能,请小心处理全局对象(请参见文档中的g对象!)和状态。


好的,谢谢。你肯定为我解决了这个问题。我的问题是关于它能处理多少请求,我只是想知道thread = true是否允许硬编码的x数量的请求同时处理。所以它是由我的机器决定的吗? - Harrison
1
我从不使用开发服务器,所以我的答案并不是最终的,但是它似乎没有设置任何限制...因此取决于系统资源而无限制。我使用uWSGI运行我的应用程序,它具有可配置的线程限制。 - Paul Becotte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接