Установить ограничение по времени для алгоритма в Юлии - PullRequest
0 голосов
/ 27 октября 2018

У меня есть код Джулии, который работает довольно долго. Я хочу запустить код в течение 3 часов, а затем прекратить его. Кто-нибудь знает, что является наиболее эффективным способом сделать это. Буду признателен за любые советы. Спасибо

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Я рекомендую использовать 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)
0 голосов
/ 27 октября 2018

@ async и @sync действительно полезны для управления процессом типа сопрограммы в Julia.Вы можете запустить асинхронный процесс, который вызывает выход на более позднем этапе, чтобы завершить всю программу:

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