能提供一下最小复现代码么,代码在我的本地跑不起来
python3.9 Ubuntu 23.10 x64 dolphindb 2.0.11.0
代码在多个循环后崩溃 引发错误Fatal Python error: deallocating None
bug复现代码如下:
def calculate_factors(self, reset=False, persist=False):
"""
处理factors表
"""
if persist and reset:
self.client_mgr.reset_factors_persist_table(self.db_name, self.strategy_code, self.strategy_params, self.strategy_params_type)
self.client_mgr.create_factors_persist_table(self.db_name, self.strategy_code, self.strategy_params, self.strategy_params_type)
i=0
while self.running_trade :
try:
valid_data_count = int(self.s.run(f"int(rows({self.bar_table_name}))"))
if valid_data_count<= 20:
time.sleep(1)
continue
else:
if persist:
print(f'{i=} {sys.getrefcount(None)=}')
i += 1
signal_list = self.s.run(f"""
use inidi
use strategy
t = select * from {self.bar_table_name} context by symbol limit -20000
bar_factors = {self.strategy_code}_factors(t)
signal = {self.strategy_code}(bar_factors)
t2 = table(last(select event_time,symbol,price,quantity from {self.tick_stream_tb_name}),
last(select signal from signal),
last(select {self.strategy_factors} from bar_factors)
)
{self.strategy_code} = loadTable("dfs://{self.db_name}", `{self.strategy_code})
{self.strategy_code}.append!(t2)
last(signal)
""")
else:
signal_list = self.s.run(f"""
use inidi
use strategy
t = select * from {self.bar_table_name}
bar_factors = {self.strategy_code}_factors(t)
last({self.strategy_code}(bar_factors))
)
""")
#更新信号值
self.signal = signal_list.signal[0]
#信号触发
if self.signal != 0:
with self.signal_condition: # 获取条件变量的锁
#通知trade执行order
self.signal_condition.notify_all()
print("Signal passed to trade module!")
time.sleep(1)
except Exception as e:
print(e)
continue
打印结果为:
sys.getrefcount(None)=34742
sys.getrefcount(None)=34742
sys.getrefcount(None)=34742
sys.getrefcount(None)=34741
sys.getrefcount(None)=34740
sys.getrefcount(None)=34737
sys.getrefcount(None)=34737
sys.getrefcount(None)=34737
sys.getrefcount(None)=34736
sys.getrefcount(None)=34736
sys.getrefcount(None)=34736
数值逐渐减少到0引发错误