ZeroMQ + Django & uwsgi issues

风流意气都作罢 提交于 2019-12-25 02:53:47

问题


Using django, we need to send a message to another, separate python program. Zeromq seems to be lightweight and should fit the bill for this.

However, trying to get it to work and it always ends up with a ZeroMQ: Bad Address error, when setting the socket to zmq.PUSH (or anything else). This is the traceback:

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

Context was made in the calling function in models.py, and just does:

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

It is launched via

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

Also have tried adding --lazy to the launch script, and that didn't help, same error.

The wsgi.py file has

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

Of course, everything works fine with runserver or, another server not using uWSGI.

So it seems that the zeromq context it creates is invalid somehow. Trying to modify the wsgi.py file to generate a zeromq context there, using @postfork still don't solve this issue, exact same error. However, I also don't like using @postfork, since that would require separate codepaths depending on if we use uWSGI or something else, and rather do this more cleanly, if possible.

What am I overlooking ?


回答1:


You have already tried all the right approaches (@postfork, --lazy-apps, --lazy...), so unless you are using a really outdated uWSGI version i can only suppose (as i see the zmq.sugar wrapper in place) that you need --enable-threads in the uWSGI options (but it would be the first time seeing it).

The problem arise because zmq context create a background thread and this thread is not inherited after fork().

Have you tried removing the master and using a single process (so removing the fork() presence) if things go better ?




回答2:


I also had such problem on uWSGI 1.9.13 from Ubuntu 13.10 repositoryes. But localy built 1.9.19 works fine.




回答3:


I tried all the different options and finally decided that the python uwsgi option would be the best for our setup. Instructions for the installation can be found at the following site



来源:https://stackoverflow.com/questions/16071125/zeromq-django-uwsgi-issues

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!