首页 > 编程问答 >如何调试:断言错误:blk ref_locs 中的间隙

如何调试:断言错误:blk ref_locs 中的间隙

时间:2024-07-24 10:29:53浏览次数:11  
标签:python multithreading debugging ib-api

我不知道如何解决这个似乎是随机发生的错误。我无法分享源代码,但如果有任何关于我可以采取哪些措施来防止此错误的想法,我将不胜感激。现在,我认为作为一种解决方法,我将捕获错误并重试...不确定这是否有效。就像上下文一样,我有一个生产者线程(显示问题的线程)填充数据帧以供消费者读取。这个问题看起来是随机的,因为它不容易重现。

Exception in thread Thread-3 (run_loop):
Traceback (most recent call last):
  File "C:\Users\justi\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 1073, in _bootstrap_inner
    self.run()
  File "C:\Users\justi\AppData\Local\Programs\Python\Python312\Lib\threading.py", line 1010, in run
    self._target(*self._args, **self._kwargs)
  File "g:\repos\stocks-projects\trading_bot\trading_bot.py", line 1027, in run_loop
    bot.run()
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\ibapi\client.py", line 263, in run
    self.decoder.interpret(fields)
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\ibapi\decoder.py", line 1387, in interpret
    handleInfo.processMeth(self, iter(fields))
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\ibapi\decoder.py", line 551, in processHistoricalDataUpdateMsg
    self.wrapper.historicalDataUpdate(reqId, bar)
  File "g:\repos\stocks-projects\trading_bot\trading_bot.py", line 230, in historicalDataUpdate
    if bar.date in minute_data_df['date'].values:
                   ~~~~~~~~~~~~~~^^^^^^^^
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\pandas\core\frame.py", line 4078, in __getitem__
    return self._get_item_cache(key)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\pandas\core\frame.py", line 4639, in _get_item_cache
    res = self._ixs(loc, axis=1)
          ^^^^^^^^^^^^^^^^^^^^^^
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\pandas\core\frame.py", line 4010, in _ixs
    col_mgr = self._mgr.iget(i)
              ^^^^^^^^^^^^^^^^^
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\pandas\core\internals\managers.py", line 1016, in iget
    block = self.blocks[self.blknos[i]]
                        ^^^^^^^^^^^
  File "G:\repos\stocks-projects\trading_bot\venv\Lib\site-packages\pandas\core\internals\managers.py", line 192, in blknos
    self._rebuild_blknos_and_blklocs()
  File "internals.pyx", line 784, in pandas._libs.internals.BlockManager._rebuild_blknos_and_blklocs
AssertionError: Gaps in blk ref_locs

“blk ref_locs 中的间隙”断言错误是一个 Pandas 错误,通常在多线程环境中并发修改 Pandas DataFrame 时发生,而未进行适当的同步。这个错误表明 Pandas DataFrame 的内部数据结构已损坏,这可能是因为多个线程同时写入 DataFrame 或一个线程修改了另一个线程正在读取的 DataFrame 造成的。

鉴于你无法共享代码,我可以提供一些通用的调试步骤和解决方案:

1. 识别并发访问

  • 检查生产者-消费者逻辑: 仔细检查生产者线程填充 DataFrame 和消费者线程访问 DataFrame 之间的定时和同步。寻找可能出现竞争条件的区域,其中两个线程可能同时尝试修改 DataFrame。
  • 打印语句/日志: 在生产者和消费者线程中添加打印语句或日志,以跟踪 DataFrame 访问和修改。这可以帮助你识别错误发生之前发生的事件序列并查明并发访问。

2. 实现同步

  • 线程锁: 使用线程锁(例如 threading.Lock )以保护对 DataFrame 的关键部分的访问。在修改 DataFrame 之前获取锁,并在完成后释放锁。 ```python import threading

    data_lock = threading.Lock()

    生产者线程

    with data_lock: # 修改 DataFrame

    消费者线程

    with data_lock: # 访问 DataFrame ```

  • 队列: 考虑使用队列(例如 queue.Queue )在生产者和消费者线程之间安全地传递数据。生产者线程可以将数据放入队列中,而消费者线程可以从队列中读取数据,从而无需直接访问共享的 DataFrame。 ```python import queue

    data_queue = queue.Queue()

    生产者线程

    data_queue.put(data_frame)

    消费者线程

    data_frame = data_queue.get() ```

3. 替代解决方案

  • 深度复制: 在将其传递给消费者线程之前,为消费者线程创建一个 DataFrame 的深度副本。这可以防止并发修改原始 DataFrame,但会带来额外的开销。 ```python import copy

    生产者线程

    consumer_df = copy.deepcopy(producer_df) ```

  • 线程安全数据结构: 探索使用线程安全数据结构(例如来自 collections 模块的字典或列表)来代替 Pandas DataFrame,尤其是在 DataFrame 的大小很大且性能受到影响的情况下。

4. 调试和测试

  • 最小化代码: 尝试创建一个最小、可重现的代码示例,以隔离问题并排除其他因素。
  • 调试器: 使用调试器逐步执行代码并检查变量,以识别并发修改发生的位置。
  • 压力测试: 使用多线程负载对代码进行压力测试,以增加发生错误的可能性并帮助你识别计时问题。

记住,在没有访问源代码的情况下,很难提供更具体的建议。但是,通过遵循这些通用调试步骤并实现适当的同步机制,你应该能够解决“blk ref_locs 中的间隙”错误并提高多线程 Python 代码的稳定性。

标签:python,multithreading,debugging,ib-api
From: 78786183

相关文章

  • Python入门知识点 7--散列类型与字符编码
    1、初识散列类型(无序序列)数据类型分为3种:   前面已经学过了两种类型   1.数值类型:int/float/bool只能存储单个数据      2.序列类型:str/list/tuple,有序的存储多个数据--有序类型,有下标,可以进行索引切片步长操作          3.散列类型......
  • Python入门知识点 6--序列类型的方法
    1、初识序列类型方法序列类型的概念:数据的集合,在序列类型里面可以存放任意的数据也可以对数据进行更方便的操作这个操作就是叫增删改查(crud)(增加(Creat),读取查询(Retrieve),更新(Update),删除(Delete)几个单词的首字母简写)增删改查是操作数据最底层的操作(从本质......
  • Python项目流程图
    我有一个由多个文件夹组成的Python项目,每个文件夹包含多个脚本。我正在寻找一个Python库或软件/包,它们可以生成流程图,说明这些脚本如何互连并绘制出从开始到结束的整个过程。自动生成Python项目流程图确实是一个挑战,目前没有完美通用的解决方案。主要原因是:......
  • 使用 mypy 时Python中的继承和多态性不起作用
    我正在寻找用mypy做一些标准的多态性,我以前从未使用过它,而且到目前为止它并不直观。基类classContentPullOptions:passclassTool(Protocol):asyncdefpull_content(self,opts:ContentPullOptions)->str|Dict[str,Any]:...子类classGoogle......
  • Python函数获取匹配和错误记录
    我有一个以下格式的json文件:[{"type":"BEGIN","id":"XYZ123"},{"type":"END","id":"XYZ123",},{"type":&......
  • python,替换标点符号但保持特殊单词完整的最佳方法
    我正在制作一个调制函数,它将采用带有特殊字符(@&*%)的关键字,并保持它们完整,同时从句子中删除所有其他标点符号。我设计了一个解决方案,但它非常庞大,而且可能比需要的更复杂。有没有一种方法可以以更简单的方式做到这一点。简而言之,我的代码匹配特殊单词的所有实例以查找跨度。然......
  • Python 检测 USB 设备 - IDLE 和 CMD 解释器之间的不同结果
    我正在尝试解决VDI解决方案中智能卡设备的USB重定向问题。我正在使用pyscard模块作为智能卡。对于进一步的上下文,主要问题是当浏览器插件调用用于处理智能卡的python脚本时,未检测到读卡器。关于问题,当我从CMD解释器运行此代码片段时,我收到空列表,表示系统上未找......
  • Python查找字符串的CRC32
    我尝试获取字符串数据类型变量的CRC32,但出现以下错误:>>>message='helloworld!'>>>importbinascii>>>binascii.crc32(message)Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>TypeError:aby......
  • 使用python,如何创建重复的工作时间表
    这是我们公司的小组工作安排表。为三班制,2组日夜工作,1组休息。重复白天工作4天休息2天,然后再次夜间工作4天休息2天的时间表。我想使用python(pandas)自动安排在8月9日之后。抱歉英语不好,提前感谢您的帮助以下是使用Python和Pandas创建重复工作时间表的代码......
  • venv 已激活,但 pip 安装仍然默认进行,并且 python 在源代码中看不到该库
    在终端shell中的vscode中输入“whichpython”显示默认路径:C:\Users\erjan\AppData\Local\Programs\Python\Python311\python.exe(my_venv)但是(my_venv)意味着我的venv处于活动状态,我做了pipinstalltransformers,但下面的代码仍然显示错误-无法看到......