当多个请求来到为django或金字塔应用程序提供服务的网络服务器时,计算机上究竟发生了什么?

seh*_*rob 6 python django webserver multithreading pyramid

我正在努力弄清楚uwsgi服务器djangopyramid应用程序处理多个请求的大局.

我现在的理解是: 当多个http请求同时发送到uwsgi服务器时,服务器为每个请求创建一个单独的进程或线程(自身的副本)(或者为它们分配请求),并且每个 进程/线程加载webapplication的代码(比如django金字塔)进入计算机内存并执行它并返回响应.在每个代码副本之间可以访问会话,缓存数据库.通常有一个单独的数据库服务器,它还可以处理对数据库的并发请求.

所以这里有一些我正在与之抗争的问题.

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

我已经搜索了这些问题,并在StackOverflow上找到了非常有趣的答案,但无论如何都无法全面了解,整个过程对我来说仍然是一个谜.如果有人能用uwsgi或任何网络服务器用django金字塔解释整个画面,那将是太棒了.

很抱歉提出一些愚蠢的问题,但他们每晚真的折磨我,我期待着你的帮助:)

Jac*_*oge 4

网络服务器的优点和缺点在于它们原则上是无状态的。这使得它们能够大规模并行。因此,实际上对于每个页面请求,可能会生成不同的线程。这种情况是否确实发生取决于您的网络服务器的配置设置。生成许多​​线程也是有成本的,因此如果可能的话,会从线程池中重用线程。

几乎所有重要的网络服务器都有页面缓存。因此,如果多次请求同一页面,则可以从缓存中检索该页面。此外,浏览器有自己的缓存。网络服务器必须清楚地知道缓存什么和不缓存什么。静态页面并不是一个大问题,尽管它们可能会被替换,在这种情况下,由于缓存而仍然提供旧页面是相当混乱的。

破坏缓存的一种方法是向页面请求添加(虚拟)参数。

网络的无状态性最初受到欢迎,因为它是实现可扩展性的必要条件,繁忙站点的网页甚至可以从附近或远程位置的不同服务器同时提供服务。

然而,趋势是拥有有状态的应用程序。状态可以在浏览器上维护,减轻服务器的负担。如果它维护在服务器上,则需要服务器知道“谁在说话”。实现此目的的一种方法是在客户端上保存并识别 cookie(可识别的小数据位)。

对于数据库来说,情况有些不同。一旦存储了与特定用户相关的任何内容,应用程序原则上就是有状态的。虽然在磁盘上和在 RAM 内存中保留状态之间没有概念上的区别,但传统上有状态性是留给数据库的,而数据库又使用线程池和负载平衡来有效地完成其工作。

随着亚马逊和谷歌等大型互联网商店的出现,为实现状态而进行的强制磁盘访问造成了性能问题。答案是内存数据库。虽然它们可以传统地使用例如 SQL 进行访问,但它们在概念上存储数据的方式上提供了更大的灵活性。

持久对象存储是一种越来越受欢迎的数据库。有了这个数据库,虽然仍然可以正式区分,但网络服务器和数据库之间的界限变得模糊了。两者都将数据存储在 RAM 中(但如果需要,可以交换到磁盘),两者都使用对象而不是 SQL 表中的平面记录。这些对象可以以复杂的方式互连。

简而言之,创新存储/线程池/缓存/持久性/冗余/同步技术出现爆炸式增长,推动了众所周知的“云”的发展。