我正在设计一个交易策略,以二进制API作为我的研究项目。以下是程序的基本方案
“/usr/lib/python3.8/
ing.py”,第852行,在start _start_new_thread(self._bootstrap,()) RuntimeError:无法启动新线程
我认为系统内存不足,因为它在循环的每一次迭代中都会创建一个新线程。是否有更好的方法让程序等待接收数据?还是要更好地管理负责等待的线程?
在测试阶段,我正在逐行读取csv文件中的数据。
tc_kline_received = threading.Condition()
for file in list_of_files:
with open(file, "r") as csv_file:
file_reader = reader(csv_file)
for line in file_reader:
btc_busd_5_min.append(line)
下面的函数从列表中弹出一行并存储在一个单独的变量中。它也用于负责等待的线程。
def collect_kline():
global btc_busd_5_min
global kline_btc_busd_5_min
global klines_dict
kline_btc_busd_5_min = btc_busd_5_min.pop(0)
klines_dict["btc_busd_5_min"] = kline_btc_busd_5_min
with tc_kline_received:
tc_kline_received.notify()
下面是永无止境的同时循环。
while True:
with tc_kline_received:
t_collect_kline = threading.Thread(target=collect_kline)
t_collect_kline.start()
tc_kline_received.wait()
t_collect_kline.join()
insert_kline_to_db(klines_dict)
create_ta_db(klines_dict)
最后两个函数是通过技术分析创建sqlite。
发布于 2022-09-07 14:49:40
,我认为系统内存不足,因为它在循环的每一次迭代中都会创建一个新线程。
循环在每次迭代中都创建一个新线程,但在新线程完成之前它无法通过t_collect_kline.join()
行,因此在任何给定的时刻都不会有超过一个"collect_kline()“线程运行。如果您的程序内存不足,那不是因为线程太多。
不幸的是,我不知道这个程序中有一半的代码实际上是做什么的,所以我不能说什么会消耗掉很多内存。
关于那些线索..。
当您的主循环创建一个新线程时,在线程完成之前,它什么也不做。这似乎没什么用。创建一个新线程的全部意义是,新线程可以做一件事,而原始线程可以做其他事情。但是,你原来的线程没有其他功能。如果您所做的下一件事是等待它结束,那么创建一个新线程就没有任何意义。
如果您只在主循环中这样做,您可以使程序更小、更简单,而且可能更快:
while True:
global btc_busd_5_min
global klines_dict
klines_dict["btc_busd_5_min"] = btc_busd_5_min.pop(0)
insert_kline_to_db(klines_dict)
create_ta_db(klines_dict)
但是就像我说的,如果你有一个内存不足的问题,那么这个改变不会解决它。它只会在内存不足情况报告的时间和地点进行更改。
https://stackoverflow.com/questions/73641476
复制相似问题