parallel-processing - 在 Julia 中停止 @spawn-ed 任务
问题描述
我处于以下情况:库中的算法使用了一些随机性,并且通常非常快但有时会卡住(例如,这对于 SAT 求解器很常见)。
我想做以下事情:启动任务的许多实例,并保持第一个成功的结果,杀死其他的。在 Julia 伪代码中:
futures = [@spawn myfunction(mydata)]
while true
i = findnext(isready, futures)
if i != nothing
result = fetch(i)
foreach(kill_task, futures)
break
end
sleep(0.1)
end
但我找不到像“kill_task”这样的东西;Distributed.del_client
听起来像是一个很好的可能性,但似乎没有这样做。
作为奖励,最好避免轮询(睡觉等)
请注意,修改“myfunction”以使其自行死亡是不可接受的,必须将其杀死(因为它在外部库中)。
解决方案
这是一个完整的代码,它产生了几个工作进程,从较早完成的那个中获取结果,一旦收到结果,所有工作进程都会被终止。我觉得这段代码对很多场景都很有用,就是科学计算:
using Distributed
addprocs(4)
@everywhere using Distributed
@everywhere function getSomething()
tt = rand(1:20)
println("working for $tt seconds")
for i in 1:tt
sleep(1.0)
end
println("Finally, I am ready")
return 100+myid()
end
function getFirst(workerf::Function, ws_list::Vector{Int}=workers())
res = Vector{Union{Future,Nothing}}(nothing,length(ws_list))
for i in 1:length(ws_list)
@async begin
res[i] = @spawnat ws_list[i] workerf()
end
end
my_res = nothing
while true
for i in 1:length(ws_list)
if res[i]!=nothing && isready(res[i])
my_res = fetch(res[i])
println(ws_list[i]," is ready!")
break
else
println(ws_list[i]," NOT ready!")
end
end
if my_res != nothing
@sync for i in 1:length(ws_list)
@async interrupt(ws_list[i])
end
break
end
sleep(0.5)
end
println(my_res)
return my_res
end
现在让我们试一试:
julia> value = getFirst(getSomething);
2 NOT ready!
From worker 4: working for 16 seconds
From worker 2: working for 19 seconds
From worker 5: working for 2 seconds
3 NOT ready!
From worker 3: working for 15 seconds
4 NOT ready!
5 NOT ready!
2 NOT ready!
3 NOT ready!
4 NOT ready!
5 NOT ready!
2 NOT ready!
3 NOT ready!
4 NOT ready!
5 NOT ready!
2 NOT ready!
3 NOT ready!
4 NOT ready!
5 NOT ready!
From worker 5: Finally, I am ready
2 NOT ready!
3 NOT ready!
4 NOT ready!
5 is ready!
Worker 3 terminated.
Worker 2 terminated.
Worker 5 terminated.
Worker 4 terminated.
让我们看看结果:
julia> println(value)
105
推荐阅读
- html - 项目在水平滚动容器中不可见
- javascript - 导出 styled-component 的组件
- xslt - XSLT:组合两个连续元素,直到元素列表为空
- kendo-ui - Kendo UI Grid 将数据传递到另一个表单
- c++ - Qt 插件绘制示例。放大和缩小
- ruby-on-rails - 编辑中的 Belongs_to 关系
- python - 连接 Pandas 系列并将系列名称添加到多级索引
- wpf - 检测 keydown 组合 Ctrl+= (Ctrl+Key.OemPlus)
- python - Keras InceptionV3 权重有问题吗?关于在 Keras 中使用预训练模型的问题
- java - RecyclerView 显示为空