在Julia中设置算法时间限制

时间:2018-10-27 15:20:36

标签: algorithm time julia julia-jump

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

3 个答案:

答案 0 :(得分:2)

@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)

答案 1 :(得分:1)

我建议使用Distributed来将您的函数作为新进程生成并控制时间(我相信我一直在回答类似的问题,但找不到答案)。

代码如下:

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

您可以像这样使用它(请注意如何导入外部软件包):

wid = addprocs(1)[1]
@everywhere using DataFrames
@everywhere function ff()
    sleep(2)
    #code fir making heavy computations
    #this is the place to write whatever you need
    return DataFrame(x=[1,2],y=[1,3])
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)

答案 2 :(得分:1)

这是使用线程的解决方案。我只是在乞求Julia中的编码,所以它不是高质量的代码,但是可以工作。您首先需要使用@task宏将函数包装为Task,然后调用 runTask()

df = df.iloc[np.r_[1,4:15], :]

此代码最糟糕的部分是使用 sleep(0.1)处于活动等待状态。我想我可以通过产生一个更多的线程来摆脱它,所以总共会有3个线程:一个线程将执行origtask的实际工作,并在执行完之后将通知一个条件,一个将等待所提到的条件,另一个将等待会休眠超时秒数,然后通知情况。