gevent-socketioとredisに依存する 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