0

它在带有猴子补丁的 Django 运行服务器下运行良好:

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

但是,在生产中,我们使用 Apache 和 mod_wsgi,以及一个 wsgi 文件。将上述内容放在 WSGI 文件中没有任何效果。似乎当调用 wsgi 文件时,它不是 as __main__,但删除if也什么都不做。

我找到gevent.wsgi.WSGIHandler()并尝试用它替换django.core.handlers.wsgi它,但它需要requestandapplication作为参数,而我的 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()
4

1 回答 1

1

你是正确的 __name__ 不是 mod_wsgi 中的 '__main__'。即使没有 if(),你在 WSGI 脚本文件中的什么地方放置了猴子补丁调用?您没有在 WSGI 脚本文件的外观中显示这一点。

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

最后一件事。您可能想在您的问题中添加您在执行此操作时想要实现的目标,因为您尝试用 gevent 中的 WSGIHandler 替换应用程序是没有意义的。

于 2013-06-13T01:20:32.890 回答