[我有一个程序,其中后端是用Python
编写的,前端是用React/Electron
编写的,并且我使用websocket,尤其是Socket.IO
在两者之间进行通信(我在后端中使用Flask-SocketIO
)。
我想每秒几秒钟连续传输少量数据(我的目标是每秒十次),但是在浏览器的接收端,数据进入了奇怪的突发:
data length time
42["TRANSFER_DATA",250] 35 18:13:42.253
42["TRANSFER_DATA",253] 35 18:13:42.255
42["TRANSFER_DATA",259] 35 18:13:42.258
42["TRANSFER_DATA",265] 35 18:13:42.553
42["TRANSFER_DATA",270] 35 18:13:42.556
42["TRANSFER_DATA",276] 35 18:13:42.557
42["TRANSFER_DATA",281] 35 18:13:42.854
42["TRANSFER_DATA",287] 35 18:13:42.855
42["TRANSFER_DATA",292] 35 18:13:42.857
42["TRANSFER_DATA",298] 35 18:13:43.156
42["TRANSFER_DATA",303] 35 18:13:43.157
42["TRANSFER_DATA",309] 35 18:13:43.160
摘自开发工具日志
您可以看到,它们不是连续(每100ms)进入,而是每300ms出现3次突发。我已经测试了后端是否冻结,并且可以确认不是,问题可能出在Socket.IO本身中。]
非常简化
后端代码:前端代码:app = Flask(__name__) sio = SocketIO(app, cors_allowed_origins="*") def send_single(data, event_name, jsonify=False): if jsonify: data = json.dumps(data) sio.emit(event_name, data, json=jsonify) def main_loop(): while True: # This code is really simplified I don't actually do while True loops in the code itself data = get_this_data_from_somewhere() send_single(data, "TRANSFER_DATA") time.sleep(0.1) if __name__ == '__main__': thread = threading.Thread(target=main_loop) thread.start() sio.run(app, host='127.0.0.1', port=58989)
非常简化
我试图完全摆脱使用import React, {Component} from 'react'; import io from 'socket.io-client' const socketURL = "http://127.0.0.1:58989"; class App extends Component { state = {value: 0}; async initSocket(){ const socket = io(socketURL); this.setState({socket}); await socket.on('connect', async () => { console.log("SocketIO connection established"); }); }; setupListeners = () => { this.state.socket.on('TRANSFER_DATA', (data) => { this.setState({value: data}); }); }; componentDidMount() { this.initSocket().then(this.setupListeners); } render() { return( <React.Fragment> <span>{this.state.value}</span> </React.Fragment> ) } } export default App;
编辑:
Flask
来查看是否与Flask相关的问题,并且在切换到Gevent
和python-socketio
之后,问题仍然存在。 我也做了一些SocketIO服务器的日志记录,它似乎以100ms的间隔正确发出了信号
2019-12-10 21:15:15,710 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:15,811 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:15,911 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,013 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,114 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,214 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,315 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,415 INFO emitting event "TRANSFER_DATA" to all [/]
2019-12-10 21:15:16,516 INFO emitting event "TRANSFER_DATA" to all [/]
[我有一个程序,其中后端是用Python编写的,前端是用React / Electron编写的,并且我使用websockets,特别是Socket.IO在两者之间进行通信(我在...中使用Flask-SocketIO,
感谢@Miguel的回复,我意识到我忘了给标准库打猴子补丁了,而且似乎已经成功了!