Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python线程--在循环中使用线程时出现的运行时错误--还有更好的解决方案吗?

Python线程--在循环中使用线程时出现的运行时错误--还有更好的解决方案吗?
EN

Stack Overflow用户
提问于 2022-09-07 13:09:16
回答 1查看 92关注 0票数 0

我正在设计一个交易策略,以二进制API作为我的研究项目。以下是程序的基本方案

  1. 程序需要等待从API接收一行数据(kline)。对于不同的对和不同的时间,时间需要不同(这是在一个单独的交易逻辑文件中设置的)。简而言之,等待时间不是固定的(因此我使用functions)
  2. Once ()和.wait()和.notify() -数据是可用的,condition.notify()开始工作,并在我希望程序永远运行的行received
  3. Because上执行技术分析,线程在一段时间内启动
  4. ,但是在我的测试阶段,在收到大约12000行数据后,脚本给了我以下错误

“/usr/lib/python3.8/

ing.py”,第852行,在start _start_new_thread(self._bootstrap,()) RuntimeError:无法启动新线程

我认为系统内存不足,因为它在循环的每一次迭代中都会创建一个新线程。是否有更好的方法让程序等待接收数据?还是要更好地管理负责等待的线程?

在测试阶段,我正在逐行读取csv文件中的数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

下面的函数从列表中弹出一行并存储在一个单独的变量中。它也用于负责等待的线程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

下面是永无止境的同时循环。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

EN

回答 1

Stack Overflow用户

发布于 2022-09-07 14:49:40

,我认为系统内存不足,因为它在循环的每一次迭代中都会创建一个新线程。

循环在每次迭代中都创建一个新线程,但在新线程完成之前它无法通过t_collect_kline.join()行,因此在任何给定的时刻都不会有超过一个"collect_kline()“线程运行。如果您的程序内存不足,那不是因为线程太多。

不幸的是,我不知道这个程序中有一半的代码实际上是做什么的,所以我不能说什么会消耗掉很多内存。

关于那些线索..。

当您的主循环创建一个新线程时,在线程完成之前,它什么也不做。这似乎没什么用。创建一个新线程的全部意义是,新线程可以做一件事,而原始线程可以做其他事情。但是,你原来的线程没有其他功能。如果您所做的下一件事是等待它结束,那么创建一个新线程就没有任何意义。

如果您只在主循环中这样做,您可以使程序更小、更简单,而且可能更快:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)

但是就像我说的,如果你有一个内存不足的问题,那么这个改变不会解决它。它只会在内存不足情况报告的时间和地点进行更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73641476

复制
相关文章

相似问题

添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文