在Julia中检测击键

在Julia中检测击键,julia,keystroke,Julia,Keystroke,我在Julia中有一段代码,其中一个解算器在寻找一个非常复杂的问题的解决方案时会多次迭代。目前,我必须为代码提供大量的迭代,设置得足够低,我不必为了保存当前状态而等待代码停止几个小时,但设置得足够高,我不必每隔5分钟激活代码 在当前状态为Julia(0.2)的情况下,是否有一种方法可以检测到一次击键,指示代码结束而不保存(如果出现问题)或结束而保存?我需要这样一种方法,除非发生这样的击键事件,否则代码将不受阻碍地继续,并且在任何迭代中都会中断 本质上,我正在寻找一个命令,如果击键发生,它将读取击

我在Julia中有一段代码,其中一个解算器在寻找一个非常复杂的问题的解决方案时会多次迭代。目前,我必须为代码提供大量的迭代,设置得足够低,我不必为了保存当前状态而等待代码停止几个小时,但设置得足够高,我不必每隔5分钟激活代码

在当前状态为Julia(0.2)的情况下,是否有一种方法可以检测到一次击键,指示代码结束而不保存(如果出现问题)或结束而保存?我需要这样一种方法,除非发生这样的击键事件,否则代码将不受阻碍地继续,并且在任何迭代中都会中断

本质上,我正在寻找一个命令,如果击键发生,它将读取击键(而Julia运行的终端具有焦点),如果击键是一个特定的键,它将运行某些代码。这可能吗


注意:我正在通过Xubuntu上的xfce4终端运行julia,以防影响所需的命令。

您可以通过发送中断(
Ctrl+C
)来实现这一点。这应该可以从REPL开始工作,而不需要对代码进行任何更改–如果要实现保存,则必须处理产生的
InterruptException
,并提示用户。

您可以从STDIN读取异步任务,阻塞直到可以读取某些内容。在主计算任务中,当您准备好检查输入时,可以调用yield()为读取任务延长几个周期,并检查全局值以查看是否读取了任何内容。例如:

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

请注意,由于这是协作多线程,因此不存在争用条件。

我对steven-g-johnson的答案有一些疑问,最后使用
通道来在任务之间进行通信:

function kbtest()
    # allow 'q' pressed on the keyboard to break the loop
    quitChannel = Channel(10)
    @async while true
        kb_input = readline(STDIN)
        if contains(lowercase(kb_input), "q")
            put!(quitChannel, 1)
            break
        end
    end

    start_time = time()
    while (time() - start_time) < 10
        if isready(quitChannel)
            break
        end

        println("in loop @ $(time() - start_time)")
        sleep(1)
    end

    println("out of loop @ $(time() - start_time)")
end
函数测试()
#允许在键盘上按“q”键以断开循环
quitChannel=通道(10)
@异步而为true
kb_输入=读线(标准输入)
如果包含(小写(kb_输入),“q”)
放!(第一频道)
打破
结束
结束
开始时间=时间()
而(时间()-开始时间)<10
如果已准备好(退出频道)
打破
结束
println(“循环内@$(time()-start_time)”)
睡眠(1)
结束
println(“循环外@$(time()-start_time)”)
结束

这需要先按,然后按,这很适合我的需要。

有没有办法使代码从引发异常时的位置继续?如果没有类似的东西,我看不出如何处理在重要变量更新过程中抛出异常的情况。我认为唯一的方法是在这些点重复异常处理程序(可能使用宏以避免太多重复).你想做的是终端编程。它通常涉及修改当前tty,然后监听击键。不过,我不知道julia中有任何软件包目前允许您这样做。我找到了一种方法,通过Tk GUI实现实现我想要的结果,其中“保存”触发代码在下一次迭代时停止,而“取消”触发错误停止代码而不保存。我把这个问题留待讨论,因为我的解决方案没有提供一种检测击键的方法,而且朱莉娅需要一种击键检测方法。谢谢你的想法,但我似乎无法实现这一点。如果我让它循环1:10,让它执行reduce(*,1:big(500000)),让它在“在这里做一些其他工作”部分中做一些慢的事情,然后在它运行时输入一些东西,它根本不会停止(对于输入,我的意思是-它只是运行,直到完成处理)。如果定期运行,或者使用额外的进程(julia-p1)运行,这都是正确的。我使用的是0.2.1-这可能是问题所在吗?