python - 当多个请求到达为 django 或 Pyramid 应用程序提供服务的网络服务器时,计算机上到底发生了什么?

标签 python django multithreading webserver pyramid

我很难弄清楚 uwsgi 服务器使用 djangopyramid 处理多个请求的大局> 申请。

目前我的理解是这样的: 当多个 http 请求同时发送到 uwsgi 服务器时,服务器为每个请求(或将请求分配给它们)并且每个进程/线程将网络应用程序的代码(例如djangopyramid)加载到计算机内存并执行它并返回响应。在代码的每个副本之间都可以访问 session 缓存数据库。通常有一个单独的数据库服务器,它也可以处理对数据库的并发请求。

所以这里有一些我正在努力解决的问题。

  1. 我的上述理解是否正确?
  2. 代码副本是否以某种方式相互交互,或者它们是否完全相互分离?
  3. session 或缓存呢?它们是在它们之间共享还是它们对每个副本都是本地的?
  4. 它们是如何创建的:通过网络服务器还是通过 python 代码的副本?
  5. 如何将响应返回给请求者:由每个进程同时返回还是将它们放入某种队列并同步发送?

我用谷歌搜索了这些问题,并在 StackOverflow 上找到了非常有趣的答案,但无论如何都无法了解全部情况,整个过程对我来说仍然是个谜。如果有人可以用 djangopyramid 和 uwsgi 或任何网络服务器来解释整个画面,那就太好了。

很抱歉问了一些愚蠢的问题,但他们每天晚上都在折磨我,我期待着你的帮助:)

最佳答案

在 pyramid 或 django 中没有魔法可以让您超越进程边界。答案完全取决于您选择的特定服务器和您选择的设置。例如,uwsgi 具有运行多线程和多进程的能力。如果 uwsig 启动了多个进程,那么它们将各自拥有自己的数据副本,除非您花时间创建一些 IPC,否则它们不会共享(这就是为什么您应该将状态保存在数据库等第三方而不是内存中的对象中不跨进程共享)。每个进程初始化一个 WSGI 对象(我们称之为 app),服务器通过 body_iter = app(environ, start_response) 调用它。这个 app 对象在进程中的所有线程之间共享并被并发调用,因此它需要是线程安全的(通常 app 使用的结构是线程本地的或只读的来处理这个问题,例如数据库的连接池)。

一般来说,你的问题的答案是事情是同时发生的,对象可能会或可能不会共享,这取决于你的服务器模型,但通常你应该把你想要共享的任何东西存储在可以处理并发的地方正确地(数据库)。

关于python - 当多个请求到达为 django 或 Pyramid 应用程序提供服务的网络服务器时,计算机上到底发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38767616/

相关文章:

django - 如何将 django-filter 与 django-tables2 一起使用

java - 没有堆栈跟踪的线程异常

Python 正则表达式 sub 单个字符

python - 为同一个项目混合编程语言

python - 当我使用较小的 float 时,为什么 sklearn 中的 KNN 实现速度会变慢?

python - 将带有虚线的日志读入 Pandas 数据框

Django 消息,如何隐藏特定消息

python - Django 表单集 : Passing a parameter in each form instance

python 检查主机是否连接到网络

c# - 优雅地终止由 QueueUserWorkItem() 分派(dispatch)的线程池任务