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

异步函数启动线程调用trading函数致WebSocket连接错误求助

问题分析与解决

首先你代码里的线程创建写法完全错误,这是触发WebSocket报错的核心原因:

  • Thread(target=trading(arg1,arg2), args=(1,2,3)) 这行代码会立即同步执行trading(arg1,arg2),而非把trading函数作为线程的执行目标。同步执行会直接阻塞异步函数bar_data_handler,导致WebSocket连接无法及时处理帧,最终抛出no close frame received or sent错误。
  • 同时args参数的用法也错了,它是用来给target指定的函数传递参数的,你现在的写法完全搞反了参数传递逻辑。

方案1:修正线程创建逻辑(适合坚持用线程的场景)

把函数对象传给target,需要传递的参数放在args元组里,并且别忘了启动线程:

async def bar_data_handler(data):
    print(date)
    # 正确的线程创建与启动方式
    t = Thread(target=trading, args=(arg1, arg2), daemon=True)
    t.start()
  • daemon=True可以让线程随主程序退出而自动结束,避免残留线程占用资源。
  • 这样trading会在新线程中独立执行,不会阻塞bar_data_handler的下一次触发。

方案2:用asyncio适配异步环境(更推荐)

在异步函数中使用asyncio.run_in_executor更贴合Python异步生态,无需手动管理线程:

import asyncio

async def bar_data_handler(data):
    print(date)
    # 利用线程池执行同步的trading函数,不阻塞事件循环
    await asyncio.get_event_loop().run_in_executor(None, trading, arg1, arg2)

该方法会将trading提交到后台线程池执行,完全不会影响bar_data_handler的异步调度,完美满足你的需求。

额外提醒:如果trading本身可以改造成异步函数,直接使用await trading(arg1, arg2)是最优解;如果它是不可修改的同步阻塞函数,上述两个方案均适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:53:11