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

如何在WebSocket订阅的回调函数中获取当前任务的strategy_id

如何在WebSocket订阅的回调函数中获取当前任务的strategy_id

我完全懂你的困扰:get_msg是个独立的回调函数,没法直接拿到每个main_ws任务里的strategy_id,而且还不能修改subscribe方法本身。别担心,有几个简单又实用的办法能解决这个问题:

方法一:用闭包(最直观的实现方式)

你可以在main_ws函数内部定义一个包装后的回调函数,这个内部函数能直接“记住”外层的strategy_id变量,然后把这个包装函数传给subscribe就行:

import asyncio

async def main_ws(strategy_id):
    hlq = HLClass.HLClass(strategy_id)
    # 定义内部包装函数,它可以直接访问外层的strategy_id
    def wrapped_get_msg(msg):
        print(f"strategy_id: {strategy_id}, msg: {msg}")
    # 把包装后的函数作为回调传入subscribe
    hlq.hl_info.subscribe({"type": "orderUpdates", "user": strategy_id}, wrapped_get_msg)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    strategy_list = [1,2,3,4]
    for strategy in strategy_list:
        asyncio.ensure_future(main_ws({'strategy_id': strategy}), loop=loop)
    loop.run_forever()

每个main_ws异步任务执行时,都会生成属于自己的wrapped_get_msg函数,它会绑定当前任务的strategy_id,当WebSocket收到消息触发回调时,自然就能输出对应的id了。

方法二:用functools.partial绑定参数

如果你不想修改get_msg的原有定义(或者想复用这个函数),可以用functools.partial把strategy_id预先绑定到回调函数的参数里:

首先调整get_msg让它接受strategy_id作为第一个参数:

from functools import partial
import asyncio

def get_msg(strategy_id, msg):
    print(f"strategy_id: {strategy_id}, msg: {msg}")

async def main_ws(strategy_id):
    hlq = HLClass.HLClass(strategy_id)
    # 用partial把strategy_id绑定到get_msg的第一个参数上
    callback = partial(get_msg, strategy_id)
    hlq.hl_info.subscribe({"type": "orderUpdates", "user": strategy_id}, callback)

partial会帮你生成一个新的函数,当这个新函数被WebSocket调用时,会自动把预先绑定的strategy_id传给get_msg,剩下的msg参数也会正常传递进去。

为什么这两种方法能行?

每个main_ws都是独立的异步任务,不管是闭包生成的函数还是partial包装后的函数,都会和当前任务的strategy_id牢牢绑定,不会和其他任务的id混淆,这样就能保证每个回调都能拿到自己对应的strategy_id啦。

备注:内容来源于stack exchange,提问作者Real Lord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:07:58