Django,sleep()暂停所有进程,但只有没有GET参数?

use*_*003 6 python django sleep

使用Django(由Webfaction托管),我有以下代码

import time
def my_function(request):
    time.sleep(10)
    return HttpResponse("Done")
Run Code Online (Sandbox Code Playgroud)

当我访问我的网址www.mysite.com时,这是通过Django执行的

我两次之后立即输入网址.我看到它的方式,这些都应该在10秒后完成.但是,第二个呼叫等待第一个呼叫,并在20秒后结束.

但是,如果我输入一些虚拟GET参数,www.mysite.com?dummy=1和www.mysite.com?dummy=2那么它们都会在10秒后完成.因此它们可以同时运行.

就好像sleep()的范围在某种程度上是全局的?也许输入一个参数使它们作为不同的进程运行而不是相同的???

它由Webfaction托管.httpd.conf有:

KeepAlive Off
Listen 30961
MaxSpareThreads 3
MinSpareThreads 1
ServerLimit 1
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
Run Code Online (Sandbox Code Playgroud)

我确实需要能够使用sleep()并相信它并没有停止一切.那么,它是什么以及如何解决它?

编辑:Webfaction使用Apache运行它.

Mar*_*rau 8

正如Gjordis所指出的,睡眠会暂停当前线程.我看过Webfaction,看起来他们正在使用WSGI来运行Django的服务实例.这意味着,每次请求进入时,Apache都会查看当前正在运行的工作进程数(即每个运行Django实例的进程).如果没有/要查看它将产生额外的工作人员并将请求交给他们.

以下是我认为你的情况:

  • 第一个GET请求资源A进来.Apache使用正在运行的worker(或者启动一个新的)
  • 工人睡了10秒钟
  • 在此期间,资源A的新请求进入.Apache看到它正在请求相同的资源并将其发送给与请求A相同的工作者.我猜这里的假设是最近处理特定资源请求的工作者工作人员更有可能缓存/预处理某些信息,以便更快地处理此请求
  • 这导致20秒的阻塞,因为只有工人等待2次10秒

这种行为在99%的时间内完全有意义,因此在逻辑上这是默认情况下执行此操作.

但是,如果您更改第二个请求所请求的资源(通过添加GET参数),Apache将假设这是一个不同的资源并将启动另一个工作程序(因为第一个已经"忙"(Apache无法知道您是没有做任何艰苦的工作).由于现在有两个工人,两个等待10秒,总时间下降到10秒.


此外,我认为事情是不对您的设计.几乎没有任何情况我可以想到尽可能快地不响应HTTP请求是明智的.毕竟,你想在最短的时间内尽可能多地提出请求,所以睡10秒是你可以做的最适得其反的事情.我建议你创建一个新问题并说明你想要达到的实际目标是什么.我很确定有一个更明智的解决方案!


Gjo*_*dis 5

假设您仅使用 来运行 Django 服务器run(),默认情况下这会生成一个单线程服务器。如果您在单线程进程上使用睡眠,则整个应用程序将在该睡眠时间内冻结。