使用默认Django http服务器的好奇行为

时间:2017-08-16 17:12:39

标签: django gunicorn

我一直被告知Django是一个同步的Web框架,它的默认Web服务器是缓慢的,不安全的,最糟糕的 - 单线程。 看看Django关于他们实现网络服务器的文档并没有透露太多细节:我被告知它是“轻量级的”,并且Django团队建议不要在生产中使用它。在Stackoverflow上搜索显示任何单个请求都会挂起另一个请求,直到第一个请求完成 - 您期望的。

但这是我在玩它时遇到的令人惊讶的一点 - 如果我发送一个服务器请求睡眠10秒(模拟长时间运行的I / O),另一个同时请求只是加载索引页面,索引页面能够在处理其他请求时立即加载。

完全相同的测试,当尝试使用单个Gunicorn工作进程在NGINX / Gunicorn后面运行的配置时,显示索引页面的加载停止,直到第一个请求(休眠10秒)完成。这种行为反映在第三个测试中,其中Gunicorn在没有NGINX的情况下运行。这是我期望的行为 - 但与默认服务器完全不同!

为什么会这样? Django的默认网络服务器在幕后发生了什么?

1 个答案:

答案 0 :(得分:1)

内置开发服务器不是单线程的,并且已经很长时间了。

Django将Python WSGIServerThreadingMixin一起子类化。这会为每个请求生成一个新线程,因此请求永远不必等待线程变为可用。这确实会降低请求速度 - 每个线程都有自己的数据库连接,因此每个新线程都必须打开一个新连接 - 但并发请求的数量仅受可用资源的限制。

按需生成线程很方便,但它也是拒绝服务攻击的一个非常容易的目标。这是开发服务器被认为不安全的原因之一,以及为什么生产就绪的WSGI服务器不使用相同的设置。