Algorithm 在Julia中设置算法的时间限制

Algorithm 在Julia中设置算法的时间限制,algorithm,time,julia,julia-jump,Algorithm,Time,Julia,Julia Jump,我有一个Julia代码,它运行了很长一段时间。我想运行代码3小时,然后终止它。有人知道最有效的方法是什么吗。如有任何建议,我将不胜感激。谢谢@async和@sync对于Julia中的协同程序类型进程控制非常有用。您可以启动一个异步进程,稍后调用exit以终止整个程序: function killafterseconds(s) @async begin sleep(s) println("terminating after $s seconds")

我有一个Julia代码,它运行了很长一段时间。我想运行代码3小时,然后终止它。有人知道最有效的方法是什么吗。如有任何建议,我将不胜感激。谢谢

@async和@sync对于Julia中的协同程序类型进程控制非常有用。您可以启动一个异步进程,稍后调用exit以终止整个程序:

function killafterseconds(s)
    @async begin 
        sleep(s)
        println("terminating after $s seconds")
        exit(0)
    end
end

function countdown(n)
    for t in n:-1:0
        println(t)
        sleep(1)
    end
end

killafterseconds(10)

countdown(10000)

@async和@sync对于Julia中的协同程序类型进程控制非常有用。您可以启动一个异步进程,稍后调用exit以终止整个程序:

function killafterseconds(s)
    @async begin 
        sleep(s)
        println("terminating after $s seconds")
        exit(0)
    end
end

function countdown(n)
    for t in n:-1:0
        println(t)
        sleep(1)
    end
end

killafterseconds(10)

countdown(10000)
我建议使用分布式来生成你的函数作为一个新的进程,并控制它的时间,我相信我已经回答了类似的问题,但我找不到答案

代码如下:

using Distributed
function run_with_timeout(timeout::Int,f::Function, wid::Int)
    result = RemoteChannel(()->Channel{Tuple}(1));
    @spawnat wid put!(result, (f(),myid()))
    res = (:timeout, wid)
    time_elapsed = 0.0
    while time_elapsed < timeout && !isready(result)
        sleep(0.5)
        time_elapsed += 0.5
    end
    if !isready(result)
        println("Timeout! at $wid")
    else
        res = take!(result)
    end
    return res
end
现在让我们运行它。请注意,第二个返回值是运行计算的workerid,您可能希望删除它:

julia> run_with_timeout(10,() ->(try;ff();catch ee;dump(ee);end ),wid)
(2×2 DataFrame
│ Row │ x     │ y     │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1   │ 1     │ 1     │
│ 2   │ 2     │ 3     │, 2)
如果我们只给代码1秒的执行时间,它将失败:

julia> run_with_timeout(1,() ->(try;ff();catch ee;dump(ee);end ),wid)
Timeout! at 2
(:timeout, 2)
最后,由于发生超时,应终止进程,否则它将继续执行:

rmprocs(wid)
我建议使用分布式来生成你的函数作为一个新的进程,并控制它的时间,我相信我已经回答了类似的问题,但我找不到答案

代码如下:

using Distributed
function run_with_timeout(timeout::Int,f::Function, wid::Int)
    result = RemoteChannel(()->Channel{Tuple}(1));
    @spawnat wid put!(result, (f(),myid()))
    res = (:timeout, wid)
    time_elapsed = 0.0
    while time_elapsed < timeout && !isready(result)
        sleep(0.5)
        time_elapsed += 0.5
    end
    if !isready(result)
        println("Timeout! at $wid")
    else
        res = take!(result)
    end
    return res
end
现在让我们运行它。请注意,第二个返回值是运行计算的workerid,您可能希望删除它:

julia> run_with_timeout(10,() ->(try;ff();catch ee;dump(ee);end ),wid)
(2×2 DataFrame
│ Row │ x     │ y     │
│     │ Int64 │ Int64 │
├─────┼───────┼───────┤
│ 1   │ 1     │ 1     │
│ 2   │ 2     │ 3     │, 2)
如果我们只给代码1秒的执行时间,它将失败:

julia> run_with_timeout(1,() ->(try;ff();catch ee;dump(ee);end ),wid)
Timeout! at 2
(:timeout, 2)
最后,由于发生超时,应终止进程,否则它将继续执行:

rmprocs(wid)

这里有一个使用线程的解决方案。我只是要求在Julia中进行编码,所以这不是高质量的代码,但它可以工作。首先需要使用@Task宏将函数包装为任务,然后调用runTask:


此代码最糟糕的部分是使用sleep0.1进行活动等待。我想我可以通过多产生一个线程来摆脱它,因此总共有3个线程:一个线程将从origtask执行实际工作,完成后将通知一个条件,一个将等待上述条件,另一个将睡眠超时秒数,然后通知该条件。

这里有一个使用线程的解决方案。我只是要求在Julia中进行编码,所以这不是高质量的代码,但它可以工作。首先需要使用@Task宏将函数包装为任务,然后调用runTask:


此代码最糟糕的部分是使用sleep0.1进行活动等待。我想我可以通过多产生一个线程来摆脱它,因此总共有3个线程:一个线程将从origtask执行实际工作,完成后将通知一个条件,一个将等待上述条件,另一个将睡眠超时数秒,然后通知该条件。

最简单的方法是使用操作系统,您是否在Linux上使用Bash?Timeout捆绑在coreutils中,如果您在mac上,可以从brew安装。你的代码可以检查一个计时器吗,或者你只是想不受任何干扰地运行它,然后在时间到的时候被杀死?最简单的方法是使用操作系统,你是在Linux上,还是在使用Bash?Timeout捆绑在coreutils中,如果您在mac上,可以从brew安装。你的代码可以检查一个计时器吗,或者你只是想在没有任何中断的情况下运行它,然后在时间到了的时候被杀死?我认为它可以工作,但我不太确定哪个去了哪里!我是个初学者,所以为这些愚蠢的问题道歉。我只是想知道为什么在函数参数中需要第二次休眠?我应该把这个命令放在哪里?在我的while循环中,我想要终止的循环,或者它应该在外部&我应该把我的代码放进一个函数中&把它放在函数中的某个地方。如果是的话,它到底应该去哪里?我试着和你一起玩,我可以告诉你,第一个争论是我想让它持续多少秒,但我不确定其余的!提前谢谢。我更新了代码,使之更具可读性和实用性。你需要把你的代码放在ff函数中。我认为它可以工作,但我不太确定哪一个去了哪里!我是个初学者,所以为这些愚蠢的问题道歉。我只是想知道为什么在函数参数中需要第二次休眠?我应该把这个命令放在哪里?在我的while循环中,我想要终止的循环,或者它应该在外部&我应该把我的代码放进一个函数中&把它放在函数中的某个地方。如果是的话,它到底应该去哪里?我试着和你一起玩,我可以告诉你,第一个争论是我想让它持续多少秒,但我不确定其余的!提前谢谢。我更新了代码,使之更具可读性和实用性。您需要将代码放在ff函数中。