使用 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 或其他东西,并且如果可能的话,更简洁地执行此操作。
我在俯瞰什么?