【问题标题】:WSGI - Should everything go below the "environ" line so that nothing is cached "globally"?WSGI - 是否应该将所有内容都放在“环境”行以下,以便“全局”缓存任何内容?
【发布时间】: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


【解决方案1】:

在导入模块时,Python 模块顶层的任何内容都只会加载一次。 这是设计使然

WSGI 服务器为每个进程导入一次你的模块,然后调用你的application 方法来处理请求。如果每个请求的数据都需要“新鲜”,不要使用模块全局变量

您如何根据请求构建数据,完全取决于您。使用函数来划分逻辑并使代码可重用,听起来是个好主意。

【讨论】:

  • 如果这个概念成为现实,这是否相当于使用同一个篮子将洗过的袜子从洗碗机运到阳台,然后再用同一个篮子将其他东西运到其他地方?
  • 我明白了.. 从洗碗机到阳台的路径被记住了,在 wsgi 和 python 中它也被记住了.. 缓存与记忆相同
  • 不,Python 模块是您可以编程的机器人。 application 函数是处理搬运洗涤篮的子程序。机器人需要有它可以调用的各种程序,以及存储如何到达阳台的数据。每次你想要洗衣服时都调用application函数,但是每次你这样做时都不需要告诉机器人如何到达阳台,或者如何握住篮子,或者如何清空篮子一次。
  • 好吧,人类是一个可以记住事物并将其缓存在大脑中的机器人。这就是为什么一次洗很多东西比分次洗更方便的原因。人类的大脑会缓存盘子是如何清洗的。它所要做的就是在缓存上一​​次执行后重复这个过程。
  • 在环境线上方定义的函数中..可以说环境线是厨房线..在厨房内如何洗盘子被记住了。但同样的功能也可以用来洗其他盘子。我现在明白了。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多