异步函数启动线程调用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
相关产品推荐
相关产品推荐

