ZeroMQ + Django& uwsgi问题

时间:2013-04-17 22:09:38

标签: python django nginx zeromq uwsgi

使用django,我们需要向另一个单独的python程序发送消息。 Zeromq似乎很轻巧,应该适合这个。

然而,在将套接字设置为zmq.PUSH(或其他任何内容)时,尝试使其工作并始终以ZeroMQ:Bad Address错误结束。 这是追溯:

Exception Type:     ZMQError
Exception Value:    Bad address
...
...
sock = context.socket(zmq.PUSH)
/usr/local/lib/python2.7/dist-packages/zmq/sugar/context.py in socket
s = self._socket_class(self, socket_type)
self <zmq.sugar.context.Context object at 0x200dc80>
socket_type 8

上下文是在models.py中的调用函数中完成的,只是:

context = zmq.Context()
sock = context.socket(zmq.PUSH)
< ^ crash here>
sock.bind('tcp://127.0.0.1:8921')
...

通过

发布
exec uwsgi_python \
    --master --pidfile=/tmp/blah.pid \
    --chdir=/path/to/site \
    --module=program.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=program.settings \
    --uid user --gid 1000 \
    --socket=/tmp/uwsgi_program.sock \
    --chmod-socket \
    --vacuum \
    --harakiri=20 \
    --processes=2 \
    --max-requests=5000 \
    --die-on-term

还尝试在启动脚本中添加--lazy,这没有帮助,同样的错误。

wsgi.py文件有

import django.core.handlers.wsgi
from raven.contrib.django.middleware.wsgi import Sentry
application = Sentry(django.core.handlers.wsgi.WSGIHandler())

当然,一切都可以正常使用runserver,或者另一台服务器没有使用uWSGI。

所以它创建的zeromq上下文似乎无论如何都是无效的。 尝试修改wsgi.py文件以在那里生成一个zeromq上下文,使用@postfork仍然无法解决此问题,完全相同的错误。但是,我也不喜欢使用@postfork,因为这需要单独的代码路径,这取决于我们是否使用uWSGI或其他东西,而是在可能的情况下更干净地执行此操作。

我在俯瞰什么?

3 个答案:

答案 0 :(得分:0)

你已经尝试了所有正确的方法(@ postforfork, - lazy-apps, - lazy ...),所以除非你使用的是真正过时的uWSGI版本,否则我只能假设(因为我看到了zmq。你需要在uWSGI选项中使用--enable-threads(但它会第一次看到它)。

问题出现是因为zmq context创建了一个后台线程,并且在fork()之后没有继承这个线程。

您是否尝试过删除主服务器并使用单个进程(如果删除fork()存在)如果事情变得更好?

答案 1 :(得分:0)

我在Ubuntu 13.10存储库中对uWSGI 1.9.13也有这样的问题。 但localy建立1.9.19工作正常。

答案 2 :(得分:0)

我尝试了所有不同的选项,最后决定python uwsgi选项对我们的设置是最好的。有关安装的说明,请参阅以下site