如何在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
相关产品推荐
相关产品推荐

