WSGI - 为什么它会在多线程中缓存 : os.popen( "date" ).read() 的输出并随机选择一个?



我醒来后通过web刷新了我的wsgi脚本。
在这个wsgi脚本中有以下python代码:

import os
ooo = os.popen("date").read()

系统日期不正确。所以我刷新了wsgi脚本。

系统时间现在显示的是早于我之前看到的系统时间。

我越刷新网页浏览器…我越注意到输出是相当随机的。

系统时间如…

python或wsgi在10个不同的线程中缓存了10次,然后从这10个缓存的线程中随机显示一个。

基于信息…结果是python没有做缓存,WSGI可能负责这个缓存。

嗯…我的理解是WSGI只是允许python通过web工作。我不知道它做的事情,如线程和缓存。

我甚至看到建议WSGI加载一次,因此它只能执行一次。

这是否意味着每次我想要非缓存结果时都必须重新加载WSGI脚本?

所以每次我在我的网站上执行wsgi脚本时,基本上可以重新启动整个apache吗?

我想这意味着如果我的网站每天收到那么多的点击,我将每天重新启动apache 100万次?

如何告诉WSGI不缓存

的输出
os.popen("date").read()

?

发生'缓存'是因为WSGI服务器/容器只加载应用程序一次。之后,对于每个请求,它都调用WSGI函数。这意味着任何全局(模块级)变量将只初始化一次。

看这个简单的例子:

#!/usr/bin/python2
import time
startup_time = time.ctime()
def application(environ, start_response):
    current_time = time.ctime()
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return [startup_time, 'n', current_time]
if __name__ == '__main__':
    from wsgiref import simple_server
    srv = simple_server.make_server('localhost', 8080, application)
    srv.serve_forever()

如果你运行这个,你会看到第一次保持不变,第二次不是。如果使用不同的WSGI服务器(如apache/mod_wsgi)运行此示例也是如此,只是通常会启动应用程序的多个实例并用于服务不同的请求。这就解释了为什么你会看到不同的值。

所以解决方案很简单:所有应该是动态的都必须在调用wsgi函数中生成,不要使用全局变量

最新更新