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