簡體   English   中英

Python:通過socket.io每10秒發送一次數據

[英]Python: Send data every 10 seconds via socket.io

我有一個與此非常相似的問題: 每 10 秒通過 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啟動,而應使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM