变量将被多次实例化

时间:2011-12-20 03:27:05

标签: python apache mod-wsgi

使用 Python2.7 + Apache + mod_wsgi 开发小型Web服务器时,我有些不寻常。该服务器的主要用途是:

  1. 接收来自其他服务器(服务器A)的常规请求,并将请求正文放入DB。
  2. 使用一些后台线程来解析数据库中的请求主体,并将解析后的信息发送到第三台服务器(服务器B)。
  3. Apache配置为 Windows'winnt'MPM 模式。 dispatch.py​​的代码,即入口点,如下所示:

    from urlparse import parse_qs
    
    pool = MyThreadClass() # A customized thread class to parse request body in DB
    pool.start()
    
    def application(environ, start_response):
        # Receiving regular request from server A and put request body into BD
        output = 'OK'
        start_response('200OK', [('Content-Type', 'text/plain')])
        return [output]
    

    一开始,线程类是在服务器启动时创建的,并且运行完美。但是,几个小时后,我发现线程类(MyThreadClass)将再次实例化,这意味着此时会有两个 MyThreadClass实例运行后台。
    我不知道在Apache启动时创建这样的实例是否正确。你有什么想法吗?

    [edit1] 以下是apache中wsgi部分的配置:

    WSGIScriptAlias / "E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py"
    WSGIPythonPath "E:/eclipse workspace/SubscriptionServer/src"
    
    <Directory "E:/eclipse workspace/SubscriptionServer">
        Order deny,allow
        Allow from all
    </Directory>
    

    [edit2] 我已按照@Graham给出的指示并将LogLevel设置为“info”。我想我找到了原因,但无法解释原因! 以下是访问日志和错误日志的日志。我的服务器正在侦听8080.服务器启动时会记录前三行error.log。但是,在 16:36:18 2011 时的访问日志中,有一个来自124.237.78.181的电话请求http://g.ha99y.com/R.asp?P=123.157.218.85:8080。就在那时,在错误日志中,服务器再次加载dispatcher.py。我无法解释这个电话的来源以及为什么它会创建两个解释器'myhost.com:8080 |'和'myhost.com |'。

    access.log:

    124.237.78.181 - - [20/Dec/2011:16:36:18 +0800] "GET http://g.ha99y.com/R.asp?P=123.157.218.85:8080 HTTP/1.1" 404 29
    

    error.log:

    [Tue Dec 20 15:50:14 2011] [info] mod_wsgi (pid=1008): Create interpreter 'myhost.com:8080|'.
    [Tue Dec 20 15:50:14 2011] [info] mod_wsgi (pid=1008): Adding 'E:/eclipse workspace/SubscriptionServer/src' to path.
    [Tue Dec 20 15:50:14 2011] [info] [client 66.220.151.121] mod_wsgi (pid=1008, process='', application='myhost.com:8080|'): Loading WSGI script 'E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py'.
    [Tue Dec 20 16:36:19 2011] [info] mod_wsgi (pid=1008): Create interpreter 'myhost.com|'.
    [Tue Dec 20 16:36:19 2011] [info] mod_wsgi (pid=1008): Adding 'E:/eclipse workspace/SubscriptionServer/src' to path.
    [Tue Dec 20 16:36:19 2011] [info] [client 124.237.78.181] mod_wsgi (pid=1008, process='', application='myhost.com|'): Loading WSGI script 'E:/eclipse workspace/SubscriptionServer/src/business/dispatcher.py'.
    

1 个答案:

答案 0 :(得分:1)

您可能修改了导致mod_wsgi重新加载的WSGI脚本文件。

使用以下方式关闭重新加载:

WSGIScriptReloading Off

每当您进行代码更改时,请确保重新启动Apache。

读:

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Reloading_In_Embedded_Mode   http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIScriptReloading