Graceful interruption and ensure finishing current loop

AllanChain
Sat, 31 Dec 2022 13:30:53 +0000
General Usage

I have a big for loop but each step only takes a few secs to finish. What I want is that when I press Ctrl+C, the program finishes the current loop and stores the states in a file.

I know there’s something called exit_on_sigint(false), but it doesn’t seem to fit my needs, because the InterruptException could be thrown anywhere and the state is corrupted in the catch block. A minimal example:

function slow_sum()
    a=0
    for i in 1:10
        try
            sleep(1)
            a+=i
        finally
            println("$a, $i") # store state
        end
    end
end

julia> slow_sum()
1, 1
3, 2
6, 3
^C6, 4
ERROR: InterruptException:

The final state is 6, 4 instead of 10, 4, which is a problem. The real program is more complicated and many states are updated in many places.

In Python, we can do this (from python - How to process SIGTERM signal gracefully? - Stack Overflow)

import signal
import time

class GracefulKiller:
  kill_now = False
  def __init__(self):
    signal.signal(signal.SIGINT, self.exit_gracefully)
    signal.signal(signal.SIGTERM, self.exit_gracefully)

  def exit_gracefully(self, *args):
    self.kill_now = True

if __name__ == '__main__':
  killer = GracefulKiller()
  while not killer.kill_now:
    time.sleep(1)
    print("doing something in a loop ...")

  print("End of the program. I was killed gracefully :)")

Is there anything equivalent to this in Julia?

1 post - 1 participant