【问题标题】:What could be casuing the simpy exception 'No scheduled events left but "until" event was not triggered'?什么可能导致懦弱的异常'没有预定的事件,但“直到”事件没有被触发'?
【发布时间】:2021-11-14 00:37:36
【问题描述】:

我正在开发一个更大的模拟器 (Mocasin),它使用 simpy 离散事件模拟框架。模拟器大部分工作正常,但对于一些较大的问题,我会收到如下错误:

Traceback (most recent call last):
  File "~/virtualenvs/mocasin/lib/python3.9/site-packages/simpy/core.py", line 190, in step
    self._now, _, _, event = heappop(self._queue)
IndexError: index out of range

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "~/virtualenvs/mocasin/lib/python3.9/site-packages/simpy/core.py", line 254, in run
    self.step()
  File "~/virtualenvs/mocasin/lib/python3.9/site-packages/simpy/core.py", line 192, in step
    raise EmptySchedule()
simpy.core.EmptySchedule

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "~/projects/mocasin/mocasin/mocasin/tasks/__init__.py", line 45, in generate_mapping
    generate_mapping(cfg)
  File "~/projects/mocasin/mocasin/mocasin/tasks/generate_mapping.py", line 74, in generate_mapping
    s.run()
  File "~/projects/mocasin/mocasin/mocasin/simulate/__init__.py", line 201, in _run
    self.env.run(finished)
  File "~/virtualenvs/mocasin/lib/python3.9/site-packages/simpy/core.py", line 260, in run
    raise RuntimeError(
RuntimeError: No scheduled events left but "until" event was not triggered: <Process(run) object at 0x7f129039d790>

我对这个错误消息的确切含义几乎一无所知,但似乎这是 simpy 中的一个内部错误。是否有人对可能触发此错误的条件有更多见解?

我不知道这个错误是否表示 simpy 中的错误,或者更确切地说是我们的 Mocasin 模拟器中的错误。为了对此进行调查,我试图找到一个触发错误的最小示例,但我一直找不到。似乎只有在具有大量事件的非常大的问题上才会触发该错误。然而,这使得很难找到根本原因。任何有关如何调试问题的指针将不胜感激。

【问题讨论】:

  • 您是否有机会发布一些重现错误的代码?

标签: python simulation simpy


【解决方案1】:

我猜这个错误可能有很多原因,但我已经设法在我的案例中调试了它的根本原因(乍一看这绝不是显而易见的)。这也使我能够推断出这个错误的整体模式。

在我的模拟中,我使用simpy.Container,它以float 格式存储物质。有时在模拟过程中,我想使用yield container.put(amount) 完全重新填充此容器。根据我的程序逻辑,这个操作应该不会超过容器的最大容量。然而,由于容器的属性.level(反映容器中当前的物质数量)在整个模拟过程中多次被浮点减法和除法(由.get()put() 调用引起)改变,最后的小数位数在.level 属性中可能会以这样的方式四舍五入,以使最终的.put() 调用(应该完全重新填充容器)将导致超出容器的最大容量很小的量。这会导致上述错误,因为您的原始进程没有进入processed 状态,因为这个内部yield container.put() 事件被认为是错误的并且不会被执行。

因此,错误的总体模式是:您的进程安排了一些事件,由于某些错误,这些事件在模拟期间没有被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-18
    • 2017-11-11
    • 2019-11-02
    • 2012-06-30
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多