我一直在尝试查找我的 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 相关的东西并重新安装解决了这个问题。有些东西很破,但现在看起来还可以:)