Python - 如何每隔x秒向websocket服务器发送消息?
我创建了一个非常简单的 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() 这个方法,它不会阻塞线程。