1

我正在编写一个依赖gevent-socketioredis的 Pyramid 应用程序。但是,我注意到当我离开建立 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

但是,如果使用示例中的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()

不幸的是,这对于开发来说相当麻烦,因为我失去了--reload功能。理想情况下,我想使用paste 集成入口点

我注意到的另一件事是gevent-sockectio Paster 集成不会猴子修补 gevent,而示例 server.py 可以。

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

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

4

2 回答 2

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。

于 2013-11-14T17:03:53.117 回答
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
于 2014-04-07T19:18:45.837 回答