flask-socketio
socket.io框架使用的是websocket协议,服务端和客户端都可以向对方发送请求,常见环境是聊天室,异步任务返回结果
以前
- 前端长轮询来获取某个任务的结果,比较耗资源
使用websocket协议
- 双方都可以发起请求
- 也是基于http协议
使用方式
- 首先需要设定异步服务的方式,推荐依次是:eventlet->gevent->theading
- 判断使用什么消息队列,redis/rabbitmq->kombu模块支持的消息队列均可以
对于flask而言,启动方式类似
1
2socketio = SocketIO(app, message_queue=f'redis://localhost:6379/1', async_mode='gevent')
socketio.run(app, '10.10.21.145', port=1233, debug=True)使用socketio的时候,消息以事件的形式被双方接收。客户端使用Javascript的回调函数,服务端需要为事件注册处理函数,就像在视图中注册路由处理函数那样。
- 使用
on
关键字来建立事件处理函数,支持返回数据供客户端回调使用 - SocketIO事件处理函数可以通过调用send()和emit()函数来向链接的客户端发送回应消息,使用
broadcast=True
来实现对每一个命名空间下的链接批量发送消息 - Flask-SocketIO通过
join_room()
和leave_room()
函数来实现每个链接的独立性 connect
和disconnect
事件分别代表建立链接和断开
部署
使用gonicorn
- 当在gunicorn中使用gevent worker和WebSocket时,启动命令必须指明使用支持WebSocket的gevent worker:
1 | gunicorn --worker-class geventwebsocket.gunicorn.workers.GeventWebSocketWorker module:app |
使用uwsgi
- uwsgi提供的参数必须使用websocket和ssl编译,才能供websocket使用
1 | $ uwsgi --http :5000 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app |