Skip to main content

创建原子循环迭代(即使被中断也让迭代完成)

项目描述

显示示例| 跳转到文档

创建原子循环迭代(即使被中断也让当前迭代完成)。

一个简单的上下文管理器,它异步监听潜在的 SIGINTSIGTERM并为您提供纯布尔标志,可用于根据是否收到中​​断/终止信号来控制while循环的迭代流。

这以前是为强化学习库构建的,该库在迭代中训练其代理,并且每次训练中断时都必须优雅地完成当前正在运行的片段。

它在类似的用例中最有用,但实际上可以用于其他任何事情。从技术上讲,任何需要不间断运行的代码块。

请注意,您仍然可以使用SIGKILL 终止正在运行的进程。

入门

pip3 install atomicloop

以下示例循环运行 3 次迭代,每次持续 3 秒。您可以尝试通过按Ctrl+C(将 SIGINT发送到进程)来中断其中一个步骤。您将看到信号反馈,但程序将等待当前迭代完成并在循环迭代完成退出。

此外,您可以看到上下文管理器知道它是否由于中断而完成。

import time
from atomicloop import AtomicLoop


# Optional callback handlers ----------------------------------------
def on_signal(signal, frame):
print(f'  Received signal: {signal}')
print('  Finishing current step before terminating')


def on_exit(was_interrupted):
print('  Ended training')
print(f'  Interrupted? {was_interrupted}')


# Running the loop --------------------------------------------------
goal_steps = 3

with AtomicLoop(on_signal, on_exit) as loop:
        step_no = 0
        while loop.run and step_no < goal_steps:
                print(f'Starting training step #{step_no}')
                time.sleep(3) # simulating some code execution
                print(f'Finished training step #{step_no}')
                print('----------------------------------\n')
                step_no += 1

文档

atomicloop.AtomicLoop(on_signal=None, on_end=None)

创建所需上下文管理器的主要且唯一的类。

on_signal是在传入的 SIGINTSIGTERM上调用的可调用对象。它使用 2 个参数调用:信号编号和当前堆栈帧。有关参数的详细信息,请参阅官方 signal.signal 文档中的处理程序部分 。

on_end是退出上下文后(在with块之后)被调用的可调用对象。它使用单个布尔参数调用,说明执行是否被中断。

AtomicLoop()返回一个新实例。要访问布尔标志以进行流量控制,您必须将该标志作为实例的属性读取。

.run布尔标志表明程序是否应该继续执行。默认情况下 为True ,并在收到中断信号时切换为False 。

您还可以使用许多同义属性之一:

  • 循环运行

  • 循环.loop

  • 循环移动

  • 循环.cont

  • 循环保持

  • loop.keep_going

  • 循环不间断

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

atomicloop-1.0.0.tar.gz (4.2 kB 查看哈希)

已上传 source

内置分布

atomicloop-1.0.0-py3-none-any.whl (4.1 kB 查看哈希)

已上传 py3