Переменная будет создана более одного раза - PullRequest
3 голосов
/ 20 декабря 2011

Я получил что-то необычное при разработке небольшого веб-сервера с использованием Python2.7 + Apache + mod_wsgi .Основное использование этого сервера:

  1. Получение регулярных запросов от другого сервера (сервер A) и помещение тела запроса в БД.
  2. Использование некоторых фоновых потоков для анализа тела запроса в БД и отправки проанализированной информации на третий сервер (сервер B).

Apache настроен как winnt WindowsРежим 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] Ниже приведен конфиг для части wsgi в apache:

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. Как раз в то время, в журнале ошибок диспетчер загрузки сервераопять.Я не могу объяснить, откуда приходит этот вызов и почему он создает двух интерпретаторов «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 Ответ

1 голос
/ 20 декабря 2011

Вы, вероятно, изменили файл сценария WSGI, в результате чего mod_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

...