IB TWS Python API中streamData线程未运行,con_thread正常的原因?
问题分析:streamData线程无法持续运行的原因
核心问题
你在创建stream_thread时犯了线程使用的典型错误:直接调用了streamData()函数,而非传递函数对象给target参数。
错误原因拆解
- 当你写
stream_thread = threading.Thread(target=streamData())时,Python会立即执行streamData()函数,将函数返回值(此处为None)赋值给target。线程启动后,发现target是None,会直接结束运行,因此stream_thread的存活状态很快变为False。 - 反观
con_thread的写法target=websocket_con是正确的:传递的是函数对象,线程启动后会在新线程中执行websocket_con函数,而app.run()是IB API的核心事件循环,会持续运行以维护连接和处理数据,所以con_thread一直处于存活状态。
修正后的代码
将错误的线程创建代码修改为以下形式:
from ibapi.wrapper import EWrapper from ibapi.client import EClient from ibapi.contract import Contract import threading import time class TradingApp(EWrapper, EClient): def __init__(self): EClient.__init__(self,self) def error(self, reqId, errorCode, errorString): print("Error. Id: ", reqId, " Code: ", errorCode, " Msg: ", errorString) Underlying = Contract() Underlying.localSymbol = "MESU2" Underlying.secType = "FUT" Underlying.currency = "USD" Underlying.exchange = "GLOBEX" def websocket_con(): app.run() def streamData(): app.reqMarketDataType(2) app.reqMktData(3002, Underlying, "", False, False, []) app = TradingApp() app.connect("127.0.0.1", 7497, 3002) time.sleep(1) con_thread = threading.Thread(target=websocket_con, daemon=True) con_thread.start() time.sleep(1) # 修正:传递函数对象而非调用函数 stream_thread = threading.Thread(target=streamData, daemon=True) stream_thread.start() time.sleep(1) while True: print("conthread",con_thread.is_alive()) print("streamthread",stream_thread.is_alive()) time.sleep(1)
补充说明
实际上streamData函数的逻辑不需要单独开线程,直接在主线程调用也能正常触发数据请求——因为IB API的请求是异步的,数据推送由app.run()的事件循环处理。但如果坚持用线程执行,只要保证传递函数对象而非直接调用函数即可。
内容的提问来源于stack exchange,提问作者Lianji
相关产品推荐
相关产品推荐

