В принципе, мне любопытно, можно ли выполнить блок кода Python "атомарно", не прерывая сигнал.
Например, я хочу выполнить операции в цикле, скажем:
for i in range(100):
do_stuff(1)
do_stuff(2)
do_stuff(3)
Но я хочу закончить все три do_stuff(1)
, do_stuff(2)
, do_stuff(3)
, если 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)
потоки и синхронизация, но я понятия не имею, как это реализовать.
- Возможно ли это?
- Если это так, можно ли сделать это красиво? С каким-то контекстным менеджером, например?
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)
Хотя я не уверен, хорошо ли это.