Python:通过socket.io每10秒发送一次数据
Python: Send data every 10 seconds via socket.io
我有一个与这个非常相似的问题:Send data every 10 seconds via socket.io
但是:我的服务端写在Python,客户端在JavaScript
目标:
- 客户端通过socket.io
连接到服务器
- 客户端每 n 秒从服务器接收推送消息
ping
- 当客户端发送
ping
消息时,服务器广播pong
消息
什么有效:
- Socket.io 连接正常
- 客户端
ping
被服务器接收,用 pong
回复,客户端再次接收
- 服务器每 5 秒执行
ping_in_intervals
什么不起作用:
- 当服务器执行
ping_in_intervals
(触发发送 ping
)时,ping
未被任何客户端接收
- 当
ping_in_intervals
循环处于活动状态时,套接字连接每分钟左右崩溃一次。如果该方法被注释掉,则套接字连接保持稳定。
观察:
ping_in_intervals
运行 所在的线程似乎无法与 wsgi 服务器线程一起正常工作。
ping_in_intervals
线程使服务器 thred 不稳定,导致它失去连接(立即重新建立连接,但它们确实每分钟左右断开一次)
- 我想,我在处理线程方面犯了严重的错误。我在 Python 中使用线程的经验很少,不知道在哪里寻找问题
服务器:
import eventlet
import socketio
import threading
sio = socketio.Server(cors_allowed_origins="*", async_mode='eventlet')
app = socketio.WSGIApp(sio)
def ping_in_intervals():
threading.Timer(5.0, ping_in_intervals).start()
print("send ping")
sio.emit('ping')
@sio.on('ping')
def ping(*args):
print("received ping - send pong")
sio.emit('pong')
ping_in_intervals()
eventlet.wsgi.server(eventlet.listen(('', 8080)), app)
客户:
const socket = io.connect('localhost:8080', {secure: true, transports: ['websocket']});
socket.on('pong', () => {
console.log('received pong');
});
socket.on('ping', () => {
console.log('received ping');
});
socket.on('connect', () => {
socket.emit('ping')
});
在 https://github.com/miguelgrinberg/python-socketio/blob/main/examples/server/wsgi/app.py#L16-L22
处找到了解决方案
每n秒推送一次服务器消息的线程不应该使用threading
启动,而是使用socketio
的start_background_task
函数启动。
这是工作代码:
import eventlet
import socketio
sio = socketio.Server(cors_allowed_origins="*", async_mode='eventlet')
app = socketio.WSGIApp(sio)
def ping_in_intervals():
while True:
sio.sleep(10)
sio.emit('ping')
@sio.on('ping')
def ping(*args):
sio.emit('pong')
thread = sio.start_background_task(ping_in_intervals)
eventlet.wsgi.server(eventlet.listen(('', 8080)), app)
我有一个与这个非常相似的问题:Send data every 10 seconds via socket.io
但是:我的服务端写在Python,客户端在JavaScript
目标:
- 客户端通过socket.io 连接到服务器
- 客户端每 n 秒从服务器接收推送消息
ping
- 当客户端发送
ping
消息时,服务器广播pong
消息
什么有效:
- Socket.io 连接正常
- 客户端
ping
被服务器接收,用pong
回复,客户端再次接收 - 服务器每 5 秒执行
ping_in_intervals
什么不起作用:
- 当服务器执行
ping_in_intervals
(触发发送ping
)时,ping
未被任何客户端接收 - 当
ping_in_intervals
循环处于活动状态时,套接字连接每分钟左右崩溃一次。如果该方法被注释掉,则套接字连接保持稳定。
观察:
ping_in_intervals
运行 所在的线程似乎无法与 wsgi 服务器线程一起正常工作。ping_in_intervals
线程使服务器 thred 不稳定,导致它失去连接(立即重新建立连接,但它们确实每分钟左右断开一次)- 我想,我在处理线程方面犯了严重的错误。我在 Python 中使用线程的经验很少,不知道在哪里寻找问题
服务器:
import eventlet
import socketio
import threading
sio = socketio.Server(cors_allowed_origins="*", async_mode='eventlet')
app = socketio.WSGIApp(sio)
def ping_in_intervals():
threading.Timer(5.0, ping_in_intervals).start()
print("send ping")
sio.emit('ping')
@sio.on('ping')
def ping(*args):
print("received ping - send pong")
sio.emit('pong')
ping_in_intervals()
eventlet.wsgi.server(eventlet.listen(('', 8080)), app)
客户:
const socket = io.connect('localhost:8080', {secure: true, transports: ['websocket']});
socket.on('pong', () => {
console.log('received pong');
});
socket.on('ping', () => {
console.log('received ping');
});
socket.on('connect', () => {
socket.emit('ping')
});
在 https://github.com/miguelgrinberg/python-socketio/blob/main/examples/server/wsgi/app.py#L16-L22
处找到了解决方案每n秒推送一次服务器消息的线程不应该使用threading
启动,而是使用socketio
的start_background_task
函数启动。
这是工作代码:
import eventlet
import socketio
sio = socketio.Server(cors_allowed_origins="*", async_mode='eventlet')
app = socketio.WSGIApp(sio)
def ping_in_intervals():
while True:
sio.sleep(10)
sio.emit('ping')
@sio.on('ping')
def ping(*args):
sio.emit('pong')
thread = sio.start_background_task(ping_in_intervals)
eventlet.wsgi.server(eventlet.listen(('', 8080)), app)