问题 Gunicorn工作人员超时


我在Nginx后面的Gunicorn运行了一个Django应用程序。一切正常,可以解决一件奇怪的事情:我有一个“下载”视图和一个RESTful json API。调用下载视图时,我使用urllib2访问json API以获取信息。并且当我尝试对json api执行此http请求时,请求超时,出现错误HTTP错误504:网关超时。

当我使用./manage.py运行服务器运行代码时,一切正常。对json api的http get请求也只需几毫秒,因此没有遇到超时的危险。

这里的伪代码情况:

MyProject的/ views.py: (可访问: http://myproject.com/download

1   def download(request, *args, **kwargs):
2       import urllib2
3       opener = urllib2.build_opener()
4       opener.open('http://myproject.com/api/get_project_stats')

opener.open() 第四行调用在Gunicorn中运行时运行时超时 ./manage.py runservereverytihng工作正常(api调用只需要几毫秒。

有没有人有同样的问题?更重要的是:你是如何解决的?


4342
2018-03-17 16:17


起源

你试过玩过吗? Gunicorn超时设置 - Sanketh Katta


答案:


我使用Gunicorn,nGinx,Django和 要求

每次我这样做:

response = requests.get('http://my.url.com/here')

工人们会超时

我通过从Syncronous(同步)工作者切换到异步(eventlet)工作者来解决问题。

如果要启动命令行添加:

-k 'eventlet'

如果您使用的是配置文件,请添加:

worker_class = "eventlet"

14
2018-06-08 16:02



感谢你的回答!就是这个! (但我没有使用异步eventlet worker解决这个问题。我使用celery在异步任务中执行HTTP请求解决了这个问题。) - Anton
当我遇到类似问题时,这对我有用。 - joemar.ct
您还必须安装eventlet。我用了 pip install eventlet 然后添加 --worker-class eventlet 到命令行。 - Gesias
eventlet 是有风险的,你的代码的每一部分都需要异步和库monkeypatched。它可能会产生意想不到的后果。 - garg10may