我正在编写一个依赖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功能。理想情况下,我想使用paste 集成入口点
我注意到的另一件事是gevent-sockectio Paster 集成不会猴子修补 gevent,而示例 server.py 可以。
如何让 pserve --reload 与 gevent-socketio 一起使用?
我已将我的测试应用程序上传到 github:https ://github.com/m-martinez/iotest