gpt4 book ai didi

Python websockets,订阅多个 channel

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:01 24 4
gpt4 key购买 nike

我正在尝试同时连接到多个 channel ,并通过 python websocket 库从推送 API 接收消息。

考虑下面的代码,您将如何连接到多个 channel ?此代码是从此处获取并稍加修改的:https://pypi.python.org/pypi/websocket-client

令我困惑的是倒数第二行:ws.on_open = on_open。 on_open 被定义为上面的函数,接受 1 个参数,但在调用该函数时没有传递任何参数,我不记得以前在 python 代码中遇到过这个,所以我不确定这一行到底发生了什么。

如何修改此代码,以便可以将包含字符串的变量传递给函数 on_open,以便可以指定我想要订阅的 Chanel 的名称?我的主要目标是能够使用多处理库传递多个 channel 以同时订阅。

我是否可以通过创建多个 ws 对象或一个 ws 对象并使用不同 channel 作为参数多次调用 on_open 来实现这一目标?

import websocket
import thread
import time
import json

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

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

def on_close(ws):
print("### closed ###")

def on_open(ws):
def run(*args):
ws.send(json.dumps({'channel':'channel1'}))
while True:
time.sleep(1)
ws.close()
print("thread terminating...")

thread.start_new_thread(run, ())

if __name__ == "__main__":
websocket.enableTrace(True)
ws = websocket.WebSocketApp("wss://random.example.com",
on_message = on_message,
on_error = on_error,
on_close = on_close)
ws.on_open = on_open
ws.run_forever()

最佳答案

使用partial传递附加参数

from functools import partial

def on_open(ws, channel_name):
"""
Notice the channel_name parameter
"""

# create a new function with the predefined variable
chan1 = partial(on_open, channel_name='channel 1')
# set the new function as the on_open callback
ws1.on_open = chan1

# do the same for the rest
chan2 = partial(on_open, channel_name='channel 2')
ws2.on_open = chan2

作为旁注,请考虑使用 TornadoCrossbar.io (又名高速公路)。这些是正确的异步框架,与线程和多处理相比,它们使 Websocket 开发更简单。

关于Python websockets,订阅多个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45645865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com