我正在编写一个依赖gevent-socketio和redis的金字塔应用程序。但是,我注意到当我离开建立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
答案 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