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機能が失われるため、これは開発にとってかなり面倒です。理想的には、 paster 統合エントリ ポイントを使用したい

私が気付いたもう 1 つのことは、gevent-sockectio ペースト統合は gevent にモンキー パッチを適用しないのに対し、examples server.py は適用することです。

pserve --reload を gevent-socketio で動作させるにはどうすればよいですか?

テスト アプリケーションを github にアップロードしました: https://github.com/m-martinez/iotest

4

2 に答える 2

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 に答える