【发布时间】:2014-06-12 11:40:13
【问题描述】:
最近我发现将python代码放在这一行上方
def application(environ, start_response):
将导致内容被缓存在 8 个线程中。
基于我的 apache 错误日志文件..我一遍又一遍地重新加载我的 wsgi 脚本并意识到 8 个线程(进程)是由 wsgi 脚本创建的。
换句话说,下面的代码..
import os
ooo = os.popen('/text-file.txt').read()
def application(environ, start_response):
start_response('200 OK', [('content-type', 'text/html')])
yield ooo
text-file.txt的内容其实是
cached
在 8 个不同的线程中。
在 wsgi 脚本创建 8 个不同的线程并缓存这 8 个不同的时间之后.. 它会从 8 个缓存中随机选择一个,因此即使
/text-file.txt
被修改、更新……等等。
解决方案似乎是放置
ooo = os.popen('/text-file.txt').read()
在environ线下就像这样:
import os
def application(environ, start_response):
ooo = os.popen('/text-file.txt').read()
start_response('200 OK', [('content-type', 'text/html')])
yield ooo
上面的代码可以正常工作。
ooo = os.popen('/text-file.txt').read()
基于文件的实时读取,8 个进程 8 个不同时间没有缓存任何内容。
这里的问题是……
如果我喜欢的行太多,例如
ooo = os.popen('/text-file.txt')
ooo2 = ooo.read()
ooo3 = "something"
ooo4 = "something else"
我的意思是,基本上整个事情都必须在
周边线
但是如果我在 wsgi 脚本中有 40 个这样的例子呢?假设它们都是不同的东西,这就是它的样子..
import os
def application(environ, start_response):
ooo = os.popen('/text-file.txt')
ooo2 = ooo.read()
ooo3 = "something"
ooo4 = "something else"
start_response('200 OK', [('content-type', 'text/html')])
yield ooo
如果有太多这样的东西..他们应该都放在下面
def application(environ, start_response):
还是应该通过
调用它们 functions ?
或者这根本不重要?
创建最快代码的方法是什么?
【问题讨论】:
-
是的,Python 模块被缓存了。这就是使用 WSGI 的意义所在,不必为每个请求重新运行新的 Python 解释器。
-
@Martijn Pieters,但它不仅仅是模块。它是正在读取的文件的内容也被缓存。在这个世界或这个宇宙中,你从哪里听说过这样的概念?
-
@Martijn Pieters,你是想说..“将文件路径提供给在 environ 行上方定义的类或函数”?
-
那是因为你把代码放在了模块级别。该代码只执行一次。 你从哪里听说过这个世界或这个宇宙中的一些概念听起来你误解了 Python 模块的工作原理。
-
@Martijn Pieters,但它到底在缓存什么(在 environ 线上方).. 模块怎么可能被缓存.. 是由字符串组成的模块还是什么
标签: python apache mod-wsgi wsgi python-2.6