WSGI为什么要缓存输出:os.popen公司(“date”).read()在多个线程中随机选择一个?

2024-04-25 06:44:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我醒来后通过网络刷新了我的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不缓存的输出

^{pr2}$

是吗?在


Tags: 代码import网络脚本wsgidateos网站
1条回答
网友
1楼 · 发布于 2024-04-25 06:44:44

之所以会出现“缓存”,是因为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函数的调用中生成,不要使用全局变量。在

相关问题 更多 >