使用gevent-socketio paster整合会导致我的应用程序无响应

时间:2013-11-13 18:01:01

标签: pyramid gevent-socketio redis-py

我正在编写一个依赖gevent-socketioredis的金字塔应用程序。但是,我注意到当我离开建立socket.io连接的视图时,我的应用程序变得没有响应。为了尝试隔离这个问题,我创建了另一个简单的应用程序并发现使用 pubsub.listen()导致了这个问题:

class TestNamespace(BaseNamespace):

    def initialize(self):
        self.spawn(self.emitter)

    def emitter(self):
        client = redis.pubsub()
        client.subscribe('anything')
        for broadcast in client.listen():
            if broadcast['type'] != 'message':
                continue

我启动应用程序的方式如下:

pserve --reload development.ini

但是,如果使用examples中的 serve.py ,我只能让我的应用程序正常工作:

import os.path

from socketio.server import SocketIOServer
from pyramid.paster import get_app
from gevent import monkey; monkey.patch_all()

HERE = os.path.abspath(os.path.dirname(__file__))

if __name__ == '__main__':

    app = get_app(os.path.join(HERE, 'development.ini'))
    print 'Listening on port http://0.0.0.0:8080 and on port 10843 (flash policy server)'

    SocketIOServer(('0.0.0.0', 8080), app,
        resource="socket.io", policy_server=True,
        policy_listener=('0.0.0.0', 10843)).serve_forever()

不幸的是,这对于开发来说相当麻烦,因为我失去了 - 重新加载功能。理想情况下,我想使用paster integration entry point

我注意到的另一件事是gevent-sockectio paster integration不是猴子补丁gevent,而示例是server.py。

如何让pserve --reload与gevent-socketio一起使用?

我已将测试应用程序上传到github:https://github.com/m-martinez/iotest

2 个答案:

答案 0 :(得分:0)

在ini文件中的[server:main]下。

use = egg:gevent-socketio#paster
transports = websocket, xhr-multipart, xhr-polling
policy_server = True
host = 0.0.0.0
port = 6543

如果您收到错误,请确保使用最新版本的gevent-socketio。

答案 1 :(得分:0)

使用 egg:gevent-socketio #paster 没有成功,我最终使用 gunicorn 监视器来实现我想要的开发:

  watchmedo auto-restart \
            --pattern "*.py;*.ini" \
            --directory ./iotest/ \
            --recursive \
            -- \
            gunicorn --paste ./iotest/development.ini

这就是我的[server:main]部分:

[server:main]
use = egg:gunicorn#main
worker_class = socketio.sgunicorn.GeventSocketIOWorker
host = 0.0.0.0
port = 8080
debug = True
logconfig = %(here)s/development.ini