我将Django与Gunicorn一起使用。由于我对Gunicorn内部不太了解,所以我想知道WSGI应用程序对象的寿命是多少。它是永久的,还是为每一个请求而创建的,还是与工人的寿命一样长?
类似地,在uWSGI中,似乎调用了一个可为一个请求调用的应用程序。那么,这是否意味着应用程序对象会存在一段时间(而uWSGI会为每个请求调用相同的对象(?
这可能很愚蠢,但我试图在应用程序级别缓存一些东西(比如在一些全局或文件级变量中(,以避免缓存(Redis/Memcached(或数据库调用。我想知道应用程序对象是否至少存在一段时间,那么定期缓存数据而不发出缓存请求(毕竟这是一个N/W请求(可能是一件好事。
请帮我理解这一点。
您似乎缺少了一些重要的区别——WSGI是PEP-333(3(规定的协议名称,gunicorn
/uwsgi
是上述协议的实现。
WSGI应用程序对象的生存期是多少。它是永久的,还是为每一个请求而创建的,还是与工人的寿命一样长?
Django有一个wsgi.py
文件,它公开了名为application
的WSGI应用程序对象,所有USGI服务器都使用它(您需要传递这个可调用对象的位置(。基本标准是应用程序对象需要接受两个参数:
- WSGI环境
- 可调用以启动响应
应用程序通过从环境中生成请求和其他必要的元数据来包装下面各层的所有内容,在发送响应时,它会调用随状态代码和标头提供的可调用对象。然后响应主体作为可迭代对象。
因此,正如您所看到的,WSGI服务器可以在启动时获取应用程序对象,并且可以在服务器进程的整个生命周期中,每次请求都调用该对象以获取响应。我主要使用uwsgi
,所以我可以告诉uwsgi
(以及其他人(正是这样做的。
为了给您提供更多的上下文,uwsgi
有一个主进程的概念,它启动工作进程并在每个进程中生成工作线程。gunicorn
(和其他(可能具有相似的概念,如果不是完全相同的话。