ZeroMQ + Django&uwsgi问题

使用Django,我们需要发送消息到另一个,单独的python程序。 Zeromq似乎是轻量级的,应该适合这个账单。

但是,试图使它工作,并且总是以ZeroMQ:Bad Address错误,当套接字设置为zmq.PUSH(或其他)时结束。 这是回溯:

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 

也试着添加 – 启动脚本,并没有帮助,同样的错误。

wsgi.py文件有

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

当然,一切工作正常runserver或另一台服务器不使用uWSGI。

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

我忽略了什么?

你已经尝试了所有正确的方法(@postfork, – lazy-apps, – lazy …),所以除非你使用的是真正过时的uWSGI版本,我只能假设(因为我看到zmq.sugar包装地方),你需要在uWSGI选项中启用线程(但是这将是第一次看到它)。

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

你尝试删除主和使用单个进程(所以删除fork()的存在),如果事情进展得更好?

我在Ubuntu 13.10版本库的uWSGI 1.9.13上也有这样的问题。 但本地建于1.9.19工作正常。

我尝试了所有不同的选项,并最终决定python uwsgi选项将是我们设置的最佳选择。 安装说明可在以下网站找到