【问题标题】:Really odd (mod)_python problem真的很奇怪(mod)_python问题
【发布时间】:2009-05-29 19:38:24
【问题描述】:

这个很难解释!

我正在编写一个通过 mod_python 运行的 python 应用程序。在每个请求中,返回的输出都不同,即使逻辑是“固定的”。

我有两个班级,classAclassB。这样:

class ClassA:
    def page(self, req):
        req.write("In classA page")
        objB = ClassB()
        objB.methodB(req)
        req.write("End of page")

class ClassB:
    def methodB(self, req):
        req.write("In methodB")
        return None

这是我所拥有的大量剪辑版本。但是我剪掉的东西并没有改变控制流。只有一个地方调用MethodB()。那是来自__init__() 中的classA

您会期望以下输出:

In classA __init__
In methodB
End of __init__

但是,看似随机地获得上述正确输出或:

In classA __init__
In methodB
End of __init__
In methodB

堆栈跟踪显示 methodB 第二次从 __init__ 调用。 methodB 只能调用一次。如果它被第二次调用,你会期望__init__ 中的其他逻辑也被执行两次。但methodB 之前或之后都没有执行,也没有递归。

我通常不会求助于使用 SO 进行调试,但我在这方面一直摸不着头脑。

版本:2.5.2 r252:60911

提前致谢

编辑 一些线索表明问题可能出在其他地方.... 以上对 sn-p 的更改导致每 250 次左右的点击中出现奇怪的输出 1。这很奇怪。

打印“In methodB”之前的输出越多,随后打印的错误就越多……平均而言,不是直接比率。它甚至在 Lynx 中也能做到。

我要回到绘图板了。

:(

回应回答

看来 mod_python 和 Apache 有婚姻问题。重新启动,对于一些请求来说一切都很好。然后一切都变得越来越梨形。发行时

/etc/rc.d/init.d/httpd stop

这需要很长的时间。 RAM 也被请求吞噬了。我对 Apache 的内部结构不太熟悉,但 感觉 就像(感谢 Nadia)线程保持活跃并且 随机插入 请求。这简直是​​疯了。

按照 S.Lott 和 Nadia 的建议迁移到 mod_wsgi

再次感谢!!

【问题讨论】:

  • 您是否打算在 MethodB 上省略“自我”?
  • 见鬼,剪辑太多,编辑不当。
  • 请使用大写的类名和小写的方法名。请发布一个显示问题的sn-p。您发布的内容按预期工作。当它起作用时无济于事。
  • @S.Lott - 我同意它应该可以工作。除了用 'req.write()' 和一堆不相关的列表分配替换 'print' 之外。差不多就是这样。
  • @Aiden:我不否认你有问题。 sn-p 确实有效。因此,您必须制造一个实际上无法让我们提供任何有用建议的 sn-p。

标签: python debugging mod-python


【解决方案1】:

我以前见过 mod_python 的类似行为。通常是因为 apache 正在运行多个线程,其中一个正在运行旧版本的代码。当您刷新页面时,使用旧代码的线程可能正在为页面提供服务。我通常通过停止 apache 然后重新启动来解决这个问题

sudo /etc/init.d/apache stop
sudo /etc/init.d/apache restart

自行重启并不总是有效。有时即使这样也行不通!这可能听起来很奇怪,但在极少数情况下,我最后的手段是在处理程序的第一行添加raise Exception() 语句,刷新页面,重新启动 apache,然后再次刷新页面。每次都这样。必须有更好的解决方案。但这对我有用。 mod_python 肯定会让人发疯!

我希望这可能会有所帮助。

【讨论】:

  • 这似乎可行。重启后错误率似乎从低变高scratches chin
  • 是的。重新启动后一切正常……然后是一个“methodB”,然后是 3,然后是 2,然后是 5,然后是 1。
  • @Aiden,相信我,我见过很多奇怪的案例。但我希望我的疯狂修复对你有用。我不建议任何人使用 mod_python!
  • @Nadia - 谢谢 :) 太晚了......我想明天我会带着清醒的头脑回到它。将安装 mod_wsgi 并试一试。不看选项就害怕 PHP :)
  • @Nadia 谢谢 :) 我从没想过会得到答案! @S.Lott 当您很久以前提到它时,我开始认为我应该为 wsgi 放弃 mod_python 。但是,python 和所有这些都是新手
【解决方案2】:

我真的不知道,但构造函数不应该返回任何东西,所以删除return None。即使他们可以返回东西,如果函数本身没有返回任何东西,None 也会自动返回。

我认为您需要在 MethodB 中使用 self 参数。

编辑:你能显示更多代码吗?这工作正常。

【讨论】:

  • 是的,这些错误与我的来源不一致,所以我编辑了这个问题,它仍然存在。这将是其中之一!时刻。
  • +1 点阅读。我知道这可能是徒劳的,因为这是一个非常奇怪的演示。 :) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多