[英]Python: Send data every 10 seconds via socket.io
我有一個與此非常相似的問題: 每 10 秒通過 socket.io 發送數據
但是:我的服務端寫在Python,客戶端寫在JavaScript
目標:
ping
ping
消息時,服務器廣播pong
消息什么有效:
ping
由服務器接收,用pong
應答,客戶端再次接收ping_in_intervals
什么不起作用:
ping_in_intervals
(觸發發送ping
)時,任何客戶端都不會收到該ping
ping_in_intervals
循環處於活動狀態時,套接字連接每分鍾左右崩潰一次。 如果該方法被注釋掉,則套接字連接保持穩定。觀察:
ping_in_intervals
的線程似乎無法與 wsgi 服務器線程一起正常工作。ping_in_intervals
線程使服務器 thred 不穩定,導致它失去連接(立即重新建立連接,但它們確實每分鍾左右斷開一次)服務器:
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
啟動,而應使用start_background_task
的 start_background_task socketio
。
這是工作代碼:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.