0

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

我在俯瞰什么?

4

3 回答 3

0

我尝试了所有不同的选项,最后决定 python uwsgi 选项最适合我们的设置。可以在以下站点找到安装说明

于 2013-11-25T13:46:52.993 回答
0

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

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

如果情况好转,您是否尝试过删除主进程并使用单个进程(因此删除了 fork() 的存在)?

于 2013-04-18T05:28:49.987 回答
0

我在 Ubuntu 13.10 存储库的 uWSGI 1.9.13 上也遇到了这样的问题。但是本地构建的 1.9.19 工作正常。

于 2013-11-11T07:58:41.883 回答