我在并行计算中读到了julia中的channel
。
我意识到我们可以使用channel
来同时进行写入和读取。当我想尝试它时,我发现当我们使用take
时,实际上我们会在channel
上获取最高数据,然后将其从中删除!另一个过程如何阅读?以及channel
如何并行?而且我不知道什么时候使用它有效,效率如何。
-------------------- EDITE ----------------------:
这是一个简单的程序,用于显示如何使用通道进行并行化:
朱莉娅> addprocs(4)
4元素数组{Int64,1}:
2
3
4
5
julia> const jobs = RemoteChannel(()->Channel{Int}(32))
RemoteChannel{Channel{Int64}}(1, 1, 6)
julia> const results = RemoteChannel(()->Channel{Tuple}(32))
RemoteChannel{Channel{Tuple}}(1, 1, 7)
julia> @everywhere function do_work(jobs,results)
while true
job_id=take!(jobs)
exec_time=rand()
sleep(exec_time)
put!(results, (job_id, exec_time, myid()))
end
end
julia> function make_jobs(n)
for i in 1:n
put!(jobs,i)
end
end
make_jobs (generic function with 1 method)
julia> n=12
12
julia> @schedule make_jobs(n)
Task (done) @0x00007fa873905a50
julia> for p in workers()
@async remote_do(do_work, p, jobs, results)
end
julia> @elapsed while n>0
job_id, exec_time, where=take!(results)
println("$job_id finished in $(round(exec_time,2)) seconds on worker $where")
n=n-1
end
4 finished in 0.13 seconds on worker 5
1 finished in 0.21 seconds on worker 4
2 finished in 0.64 seconds on worker 3
3 finished in 0.82 seconds on worker 2
6 finished in 0.72 seconds on worker 5
7 finished in 0.35 seconds on worker 3
5 finished in 0.89 seconds on worker 4
11 finished in 0.33 seconds on worker 4
10 finished in 0.61 seconds on worker 3
8 finished in 0.82 seconds on worker 2
9 finished in 0.71 seconds on worker 5
12 finished in 0.24 seconds on worker 4
0.082128167
我无法理解!我们可以使用for
循环而不是函数do_work
!然后我们可以将结果保存为SharedArray
,然后我们可以通过动态调度或其他方式将其并行。
我们为什么这样使用?
其实我的问题是我们这样使用的时候?为什么?