我有一段运行一段时间的Julia代码。我想将代码运行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的实际工作,并在执行完之后将通知一个条件,一个将等待所提到的条件,另一个将等待会休眠超时秒数,然后通知情况。