mod_wsgi / Python是否优化了一些东西?

时间:2009-06-05 19:25:33

标签: python debugging caching mod-wsgi

我一直在尝试使用我的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

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

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

注意,在刷新时,如果符合预期,REMOTE_PORT每次递增一次......当它使用短输出时,REMOTE_PORT的增量会大幅跳跃。可是不相关的。

我是Python新手,温柔

解决

谁知道它是什么,但是扯掉Apache,mod_python,mod_wsgi以及几乎所有HTTP相关和重新安装修复了问题。有些东西非常破碎但现在看来还不错:)

3 个答案:

答案 0 :(得分:3)

Apache / mod_wsgi可以在多进程/多线程配置中运行可以使代码绊倒,该代码是在假设它在单个进程中运行的情况下编写的,该进程可能是单线程的。有关不同配置可能性的讨论以及共享数据的所有含义,请参阅:

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

答案 1 :(得分:1)

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

没有

问题是(通常)你的程序中有一个全局变量没有像你希望的那样重置。

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

你可以 - 无意中 - 拥有一个依赖于某个全局变量的函数。我打赌这个。

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

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

答案 2 :(得分: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相关和重新安装修复了问题。有些东西非常破碎但现在看来还不错:)