在Apache下使用mod_wsgi在Django中部署gevent

时间:2013-06-12 16:40:13

标签: django mod-wsgi wsgi gevent

在Django的runserver下使用猴子补丁正常工作:

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

但是,在生产中我们使用带有mod_wsgi的Apache和一个wsgi文件。将上述内容放在WSGI文件中无效。似乎在调用wsgi文件时,它不是__main__,但删除if也没有做任何事情。

我找到gevent.wsgi.WSGIHandler()并试图用django.core.handlers.wsgi替换它,但它需要requestapplication作为参数,我在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 个答案:

答案 0 :(得分:1)

你是对的,mod_wsgi中的__name__不是'__main__'。即使没有if(),你在WSGI脚本文件中放置了哪个猴子补丁调用?您没有在WSGI脚本文件中显示它。

总的来说,无论如何,在mod_wsgi中使用gevent monkey补丁可能是一个坏主意。这是因为使用gevent通常会给人们一种虚假的安全感,他们不再需要处理线程锁定,因为greenlet在某种程度上会执行顺序执行,所以对于简单的东西它是不需要的。在mod_wsgi下依赖它绝对是一个坏主意,因为所有请求处理程序线程仍然是真正的线程而不是greenlet,因为线程是使用Apache线程API创建为外部线程的。因此,仍然需要正确处理线程锁定。

最后一件事。您可能希望在执行此操作时向您的问题添加您要尝试实现的内容,因为尝试使用gevent中的WSGIHandler替换应用程序毫无意义。