You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为ThreadedWebsocketManager的回调函数添加第二个自定义参数dic

解决方案

首先先修正你现有代码的两处逻辑问题,否则即使传参成功字典内容也会不符合预期:

  • get_dic函数没有返回值,你需要在函数末尾添加return dic才能拿到生成的字典
  • 循环中直接对dic赋值新字典会覆盖之前写入的所有键值对,最终只会保留最后一组symbol和interval对应的三个key,需要替换为update方法写入键值对

修正后的get_dic参考:

def get_dic():
    dic = {}
    for interval in intervals:
        for symbol in symbols:
            dic.update({
                (symbol, interval, 'high'): [],
                (symbol, interval, 'low'): [],
                (symbol, interval, 'close'): []
            })
    historical(dic)
    return dic

方法1:使用lambda闭包传递参数(最简便)

直接在指定callback时用lambda匿名函数做一层包装,预先绑定你生成的字典:

  1. 首先调用get_dic拿到字典实例:
dic = get_dic()
  1. 修改start_multiplex_socket的callback参数:
twm.start_multiplex_socket(callback=lambda msg: add_new_data_values(msg, dic), streams=streams)

lambda会接收socket默认传递的msg作为唯一入参,内部调用你定义的回调函数时自动传入提前准备好的dic,匹配你add_new_data_values(msg, dic)的参数定义。

方法2:使用functools.partial预绑定参数

你也可以用Python标准库的偏函数工具实现参数绑定:

  1. 导入偏函数工具:
from functools import partial
  1. 拿到字典实例后修改callback参数:
twm.start_multiplex_socket(callback=partial(add_new_data_values, dic=dic), streams=streams)

partial会提前把dic作为关键字参数绑定到回调函数上,socket传递的msg会作为第一个位置参数传入,同样可以正常调用。

注意:dic是多线程共享的变量,多个websocket回调线程同时写入时可能出现竞态条件,建议添加线程锁保证数据安全。

内容的提问来源于stack exchange,提问作者Jellyfish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:15:01