Python - 如何每隔x秒向websocket服务器发送消息?

0 投票
2 回答
46 浏览
提问于 2025-04-14 15:18

我创建了一个非常简单的 websocket 应用,它可以从 websocket 连接中接收实时数据。

我遇到的问题是,每隔 5 秒我必须向服务器发送一条消息,以免被断开连接。有没有什么方法可以做到这一点,而不让程序卡住呢?

这是我尝试过的,问题在于整个线程会被 send_ping 函数卡住:

import websocket
import _thread
import time
import rel

def send_ping(ws):
    ws.send("ping")
    time.sleep(5)

def on_message(ws, message):
    print(message)

def on_error(ws, error):
    print(error)

def on_close(ws, close_status_code, close_msg):
    print("### closed ###")

def on_open(ws):
    print("Opened connection")
    test_thread = threading.Thread(target=send_ping, args=(ws,))
    test_thread.start()

if __name__ == "__main__":
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://api.gemini.com/v1/marketdata/BTCUSD",
                              on_open=on_open,
                              on_message=on_message,
                              on_error=on_error,
                              on_close=on_close)

    ws.run_forever(dispatcher=rel, reconnect=5)  # Set dispatcher to automatic reconnection, 5 second reconnect delay if connection closed unexpectedly
    rel.signal(2, rel.abort)  # Keyboard Interrupt
    rel.dispatch()

注意:不幸的是,使用 ws.run_forever(ping_payload="ping", ping_timeout=5) 并不是一个解决办法,因为这个库使用了服务器不识别的操作码,而且 据我所知,没有办法在不更改库源代码的情况下更改操作码

2 个回答

1

你可以定义一个发送消息的函数,然后在一个循环里调用这个函数,接着等待5秒再试一次。比如说:

import time
def send_message(message):
    your code here...

这个循环可以这样写。

if __name__ = "__main__":
while True:
    send_message("my message")
    time.sleep(5)
1

我会使用 asyncio 这个包和异步函数。在这里,你可以使用 asyncio.sleep() 这个方法,它不会阻塞线程。

撰写回答