gpt4 book ai didi

python - 是否可以防止 python 在 block 结束之前终止?

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:16 25 4
gpt4 key购买 nike

基本上,我很好奇是否有可能在不被信号中断的情况下“原子地”执行一段 python 代码。

例如,我想在循环中执行操作,比方说:

for i in range(100):
do_stuff(1)
do_stuff(2)
do_stuff(3)

但我想完成所有三个 do_stuff(1)do_stuff(2)do_stuff(3) if do_stuff(1) 成功开始。脚本应忽略 CTRL+C,完成这三个指令,然后在发生 SIGINT 时终止。不必执行所有 100 次迭代。

我相信这可以通过自定义信号处理程序来完成

import signal

def handler(signum, frame):
# wait for the loop iteration finish and exit
signal.signal(signal.SIGINT, handler)

线程和同步,但我不知道如何实现。

  1. 这可能吗?
  2. 如果是,可以做得很好吗?例如,使用某种上下文管理器?
for i in range(100):
with atomic_execution():
do_stuff(1)
do_stuff(2)
do_stuff(3)

编辑:同时我创建了这个:

import threading
import sys
import signal


class atomic_execution:
started = 0
execution_in_progress = threading.Lock()

def __enter__(self):
atomic_execution.execution_in_progress.acquire()

def __exit__(self, type, value, traceback):
atomic_execution.execution_in_progress.release()


def handler(signum, frame):
atomic_execution.execution_in_progress.acquire()
sys.exit(0)

signal.signal(signal.SIGINT, handler)

while True:
with atomic_execution():
print(1)
print(2)
print(3)

虽然我不确定它是否好。

最佳答案

这是基本思想:

import signal
import time

stop = False

def sighandler(*unused):
global stop
print('signal caught')
stop = True

def main():
for i in range(10):
print('a')
time.sleep(0.5)
print('b')
time.sleep(0.5)
print('c')
time.sleep(0.5)
print()
if stop:
print('STOP')
break

if __name__ == '__main__':
signal.signal(signal.SIGINT, sighandler)
main()

我认为为此目的制作一个上下文管理器并不难:

输入时:

  • 保存当前的信号处理程序
  • 像上面的例子一样安装自己的处理程序并设置一个标志

退出时:

  • 恢复原来的信号处理程序
  • 如果设置了标志则退出

但我不喜欢这个想法,因为你想在循环之前安装一次处理程序并在每次迭代时多次测试标志。

关于python - 是否可以防止 python 在 block 结束之前终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56224887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com