当前位置:首页>python>每日Python面试题 · 第6期

每日Python面试题 · 第6期

  • 2026-09-04 07:25:01
每日Python面试题 · 第6期

WebSocket与Flask-SocketIO

一、基础知识题

1. 什么是 WebSocket?它解决了什么问题?

参考答案:

WebSocket 是一种基于 TCP 的全双工通信协议。

传统 HTTP 通信模式:

  • 客户端发起请求
  • 服务端返回响应
  • 服务端无法主动推送消息

WebSocket 建立连接后:

  • 客户端可以主动发消息
  • 服务端也可以主动推送消息
  • 保持长连接

适用于:

  • 聊天室
  • 在线游戏
  • 实时监控
  • 股票行情
  • 协同编辑

2. WebSocket 和 HTTP 的区别是什么?

对比项
HTTP
WebSocket
通信方式
请求-响应
双向通信
连接方式
短连接
长连接
服务端主动推送
不支持
支持
开销
请求头重复传输
一次握手长期使用
实时性
较差
很高

3. 什么叫全双工通信?

参考答案:

全双工通信表示:

客户端和服务端都可以同时发送和接收数据。

例如:

  • 微信聊天
  • 电话通话
  • WebSocket

而 HTTP 属于半双工模式。


4. Flask 本身支持 WebSocket 吗?

参考答案:

不支持。

需要借助:

Flask-SocketIO

扩展实现 WebSocket 功能。

安装:

pip install flask-socketio

二、代码理解题

5. 下面代码的作用是什么?

@socketio.on('message')def handle_message(msg):    send(f"收到消息:{msg}", broadcast=True)

参考答案:

作用:

监听客户端发送的 message 事件。

收到消息后:

  • 服务端处理消息
  • 使用 send() 向所有客户端广播

其中:

broadcast=True

表示群发。


6. send() 和 emit() 有什么区别?

参考答案:

send:

send("hello")

用于发送默认 message 事件。

emit:

emit("chat", {    "msg": "hello"})

用于发送自定义事件。

实际开发中 emit 使用更多。


7. Flask-SocketIO 中 @socketio.on() 的作用是什么?

参考答案:

用于注册事件监听器。

例如:

@socketio.on("login")

表示监听客户端触发的 login 事件。

类似于:

socket.emit("login")

三、实战开发题

8. 如何实现聊天室广播功能?

参考答案:

客户端:

socket.send("hello")

服务端:

@socketio.on('message')def handle_message(msg):    send(msg, broadcast=True)

通过:

broadcast=True

实现消息广播。


9. 什么是 Room(房间)?

参考答案:

Room 是 SocketIO 的分组机制。

例如:

  • 游戏房间A
  • 游戏房间B
  • 群聊1
  • 群聊2

同一个房间内消息互通。

不同房间互不影响。


10. 如何让用户加入房间?

参考答案:

from flask_socketio import join_roomjoin_room("room1")

或者:

@socketio.on("join_room")def join(data):    join_room(data["room"])

11. 如何向指定房间发送消息?

参考答案:

emit(    "chat",    data,    to="room1")

只有 room1 的用户能收到。


12. 如何让用户退出房间?

参考答案:

leave_room(room)

四、性能与架构题

13. 为什么 WebSocket 比 HTTP 更适合实时系统?

参考答案:

原因:

  • 长连接
  • 无需反复建立连接
  • 减少请求头传输
  • 服务端主动推送

因此:

  • 延迟更低
  • 吞吐量更高

14. 如果有 10 万个 WebSocket 连接怎么办?

参考答案:

单机难以支撑。

通常采用:

  • Nginx
  • Redis
  • RabbitMQ
  • 多实例部署

架构:

Client   ↓Nginx   ↓WebSocket Server Cluster   ↓Redis Pub/Sub

15. 为什么 Flask-SocketIO 推荐 eventlet 或 gevent?

参考答案:

因为 Flask 默认 WSGI 是同步阻塞模型。

大量连接时:

一个请求占一个线程

资源消耗大。

eventlet / gevent:

  • 协程
  • 非阻塞IO
  • 高并发

例如:

pip install eventlet

16. Redis 在 WebSocket 集群中的作用是什么?

参考答案:

作为消息总线。

例如:

服务器A收到消息:

A -> Redis

Redis:

Redis -> B、C、D

所有服务器同步广播。

解决多节点消息同步问题。


五、监控与优化题

17. 如何统计当前在线人数?

参考答案:

连接时:

metrics["connections"] +=1

断开时:

metrics["connections"] -=1

监听:

connectdisconnect

事件。


18. 如何计算消息延迟?

参考答案:

客户端发送:

timestamp

服务端收到:

latency=time.time() -timestamp

即可得到延迟。


19. 监控系统中为什么只保留最近100条延迟记录?

if len(samples) > 100:    samples.pop(0)

参考答案:

避免:

  • 内存持续增长
  • 计算平均值越来越慢

属于滑动窗口思想。


六、开放性问题(高频)

20. 请设计一个百万级在线聊天室架构。

参考答案方向:

组件:

Nginx

↓

WebSocket Gateway

↓

Redis Cluster

↓

Chat Service

↓

MySQL

实现:

  • WebSocket长连接
  • Redis Pub/Sub
  • 消息持久化
  • ACK确认机制
  • 离线消息
  • 心跳检测
  • 分布式部署

21. WebSocket 连接断开后如何实现自动重连?

参考答案:

前端监听:

socket.on("disconnect")

定时重连:

setTimeout(connect, 3000)

并增加:

  • 最大重试次数
  • 指数退避算法

22. WebSocket 如何保证安全?

参考答案:

措施:

  1. 使用 WSS
ws://↓wss://
  1. Token认证
JWT
  1. 权限控制
  2. 限流
  3. 防止恶意连接

综合编程题(面试官最爱)

题目:

请使用 Flask-SocketIO 实现一个简易聊天室,要求:

  1. 用户连接后自动加入大厅
  2. 支持发送聊天消息
  3. 支持创建房间
  4. 支持加入房间
  5. 支持退出房间
  6. 显示当前在线人数
  7. 服务端记录聊天日志
  8. 支持断线重连

考察点:

  • Flask
  • SocketIO
  • WebSocket
  • Room机制
  • 广播机制
  • 在线状态管理
  • 异常处理
  • 系统设计能力

最新文章

随机文章