2

我一直在尝试查找我的 mod_wsgi/Python Web 应用程序的奇怪问题。我有创建对象并调用方法的应用程序处理程序:

def my_method(self, file):
    self.sapi.write("In my method for %d time"%self.mmcount)
    self.mmcount += 1

    # ... open file (absolute path to file), extract list of files inside
    # ... exit if file contains no path/file strings
    for f in extracted_files:
        self.num_files_found += 1
        self.my_method(f)

在本文的开头和结尾,我写

obj.num_files_found

到浏览器。

所以这是一个递归函数,它沿着文件内的文件引用树向下移动。打印文件中的任何引用,然后打开并检查这些引用,依此类推,直到所有文件都是不包含文件的叶节点。为什么我这样做并不重要……这更像是一个迂腐的例子。

你会期望输出是确定性的

Files found: 0
In my method for the 0 time
In my method for the 1 time
In my method for the 2 time
In my method for the 3 time
...
In my method for the n time
Files found: 128

对于前几个请求,它符合预期。然后,只要我刷新,我就会得到以下信息

Files found: 0
In my method for the 0 time
Files found: 128

即使我知道,从以前的刷新和没有代码/文件更改来看,枚举 128 个文件需要n次。

那么问题来了:mod_wsgi/Python 是否包含会停止完整执行的内部优化?它是否猜测输出是确定性的和缓存的?

需要注意的是,在按预期刷新时,REMOTE_PORT 每次递增一......当它使用短输出时,REMOTE_PORT 的增量会急剧跳跃。不过可能无关。

我是 Python 新手,要温柔

解决了

谁知道它是什么,但是去掉 Apache、mod_python、mod_wsgi 和几乎所有与 HTTP 相关的东西并重新安装解决了这个问题。有些东西很破,但现在看起来还可以:)

4

3 回答 3

3

Apache/mod_wsgi 可以在多进程/多线程配置中运行,这可能会导致在假设它在单个进程中运行的情况下编写代码,而该进程可能是单线程的。有关不同配置可能性的讨论以及这对共享数据意味着什么,请参阅:

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

于 2009-06-24T12:47:20.720 回答
1

“mod_wsgi/Python 是否包含会停止完整执行的内部优化?它是否猜测输出是确定性和缓存的?”

不。

问题是(通常)您的程序中有一个全局变量没有按照您希望的方式重置。

有时这可能是无意的,因为 Python 检查本地命名空间和全局命名空间的变量。

你可以——不经意间——拥有一个依赖于某个全局变量的函数。我敢打赌。

您可能会看到许多 mod_wsgi 守护进程,每个进程都有一个全局变量问题。每个守护进程的第一个请求有效。然后您的全局变量处于阻止工作发生的状态。[文件保持打开状态,顶级目录变量被覆盖,谁知道?]

在最初的几个之后,所有的守护进程都停留在“其他”模式,他们报告答案而不做真正的工作。

于 2009-06-05T19:39:29.263 回答
1

看来 Python/mod_wsgi 安装必须被破坏。我从未见过如此奇怪的错误。返回旁边的跟踪:

self.sapi.write("Returning at line 22 for call %d"%self.times_called)
return someval

多次出现:

在第 22 行返回呼叫 3

在第 22 行返回呼叫 3

在第 22 行返回呼叫 3

任何东西的控制流都没有一致的逻辑:(我也很确定我可以编写简单的递增代码来计算方法被调用的次数。绝对,令人沮丧,胡说八道。我什至把纪元时间放在了下一个每次调用 sapi.write() 以确保不是盲目地重复代码。它们是独一无二的:S

是时候淘汰 Apache、Python、mod_wsgi 和其他工具并重新开始了。

解决了

谁知道它是什么,但是去掉 Apache、mod_python、mod_wsgi 和几乎所有与 HTTP 相关的东西并重新安装解决了这个问题。有些东西很破,但现在看起来还可以:)

于 2009-06-05T20:18:33.943 回答