Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detecting keystrokes in Julia

I have a piece of code in Julia in which a solver iterates many, many times as it seeks a solution to a very complex problem. At present, I have to provide a number of iterations for the code to do, set low enough that I don't have to wait hours for the code to halt in order to save the current state, but high enough that I don't have to keep activating the code every 5 minutes.

Is there a way, with the current state of Julia (0.2), to detect a keystroke instructing the code to either end without saving (in case of problems) or end with saving? I require a method such that the code will continue unimpeded unless such a keystroke event has happened, and that will interrupt on any iteration.

Essentially, I'm looking for a command that will read in a keystroke if a keystroke has occurred (while the terminal that Julia is running in has focus), and run certain code if the keystroke was a specific key. Is this possible?

Note: I'm running julia via xfce4-terminal on Xubuntu, in case that affects the required command.

like image 260
Glen O Avatar asked May 11 '14 14:05

Glen O


2 Answers

You can you an asynchronous task to read from STDIN, blocking until something is available to read. In your main computation task, when you are ready to check for input, you can call yield() to lend a few cycles to the read task, and check a global to see if anything was read. For example:

input = ""
@async while true
    global input = readavailable(STDIN)
end
for i = 1:10^6 # some long-running computation                                  
    if isempty(input)
        yield()
    else
        println("GOT INPUT: ", input)
        global input = ""
    end
    # do some other work here                                                   
end

Note that, since this is cooperative multithreading, there are no race conditions.

like image 92
Steven G. Johnson Avatar answered Sep 16 '22 20:09

Steven G. Johnson


You may be able to achieve this by sending an interrupt (Ctrl+C). This should work from the REPL without any changes to your code – if you want to implement saving you'll have to handle the resulting InterruptException and prompt the user.

like image 35
one-more-minute Avatar answered Sep 16 '22 20:09

one-more-minute