朱莉娅的频道

时间:2017-08-03 06:45:12

标签: julia

我在并行计算中读到了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,然后我们可以通过动态调度或其他方式将其并行。 我们为什么这样使用? 其实我的问题是我们这样使用的时候?为什么?

0 个答案:

没有答案