2013-06-12 3 views
0

Он отлично работает под runserver Джанго с обезьяной пластыря:Развертывание GEvent в Django с mod_wsgi под Apache

if __name__ == "__main__": 
    import gevent 
    from gevent import monkey 
    monkey.patch_all() 
    execute_manager(settings) 

Однако, в производстве мы используем Apache с mod_wsgi, и файл WSGI. Внесение вышеуказанного в файл WSGI не влияет. Кажется, что когда вызывается файл wsgi, это не как __main__, но удаление if также ничего не делает.

Я нашел gevent.wsgi.WSGIHandler() и попытался заменить django.core.handlers.wsgi с ним, но он требует request и application в качестве параметров, которые я не имею в моем файле WSGI.

Это то, что мой файл WSGI выглядит следующим образом:

import os,sys 
import django.core.handlers.wsgi 
from gevent import wsgi 
sys.path.append('/app/src') 
sys.path.append('/app/src/webInterface') 
os.environ['DJANGO_SETTINGS_MODULE'] = 'WebInterface.settings' 

#application = django.core.handlers.wsgi.WSGIHandler() 
application = wsgi.WSGIHandler() 

ответ

1

Вы правы, что __name__ не '__main__' в mod_wsgi. Даже без if(), где в файле сценария WSGI вы поместили вызов патча обезьяны? Вы не показываете, как выглядит файл сценария WSGI.

В целом, использование gevent monkey patching в mod_wsgi - это, вероятно, плохая идея. Это связано с тем, что использование gevent обычно дает людям ложное представление о безопасности, что им больше не нужно иметь дело с блокировкой потоков, потому что зелья будут в некотором роде выполнять заказ, поэтому для простых вещей это не нужно. Скорее всего, это плохая идея полагаться на то, что в mod_wsgi, потому что все потоки обработчика запросов по-прежнему будут настоящими потоками, а не зелеными, потому что потоки создаются как внешние потоки с использованием API потоков Apache. Таким образом, очень многое необходимо для правильного управления резьбой.

Последнее изделие. Возможно, вы захотите добавить к своему вопросу то, чего вы пытаетесь добиться, потому что ваши попытки заменить приложение WSGIHandler от gevent не имеют смысла.

+0

Можете ли вы рассказать о том, почему это не имеет смысла? Я подумал, что WSGIHandler() Gevent является версией родного WSGIHandler() с обезьяной. Наверное, это не так? – Goro

+0

WSGIHandler() в gevent не имеет ничего общего с Django. Он выглядит как внутренний помощник запроса для собственного WSGI-сервера gevent. Это даже не действительное приложение WSGI, поэтому он пытается использовать его, поскольку объект приложения в WSGI-скрипте должен давать ошибку 500 при каждом запросе. –

+0

ОК. Было бы неплохо, если бы в документации упоминалось об этом :) – Goro

Смежные вопросы