2013-04-17 41 views
0

使用django,我们需要发送消息到另一个独立的python程序。 Zeromq似乎很轻巧,应该适合这个账单。ZeroMQ + Django&uwsgi问题

但是,试图让它正常工作,并且当将套接字设置为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 

也试图推出添加 - 启动脚本,并没有帮助,相同的错误。

的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或其他东西,而且如果可能的话,这样做更干净。

我在忽略什么?

回答

0

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

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

您是否尝试过删除master并使用单个进程(因此删除fork()存在)如果事情进展得更好?

+0

其实,我试过--lazy-apps,并且这是一个无效的选项。然后我检查了uWSGI本身的版本,并且显示了uWSGI 1.0.3-debian。 (这是在Ubuntu上)。服务器也运行uwsgi_python而不是uWSGI,这是否有所不同? – phpBoing

0

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

0

我尝试了所有不同的选项,最后决定python uwsgi选项对我们的设置是最好的。安装说明可在以下网址找到:site