美文网首页
julia 多线程计算结果的收集(二)

julia 多线程计算结果的收集(二)

作者: 昵称违法 | 来源:发表于2021-01-31 19:55 被阅读0次

一、预分配空间,为每个任务定义一个单独的cell,存放计算结果

1、定义一个数组,数组的总个数(长度)就是for循环的总次数(任务的个数)。
2、每次for循环,只修改数组对应的元素。比如,第一次循环,修改第一个元素,array[1];第二次循环,修改第二个元素,array[2],以此类推。

tasks = rand(tasks)        #计算的任务
tasks_num = length(tasks)  #任务的数量
ary = zeros(tasks_num)     #预分配一个数组容器,用于保存计算结果
items = [(idx = i,task = t) for (i,t) in zip(1:tasks_num,tasks) ]  #每次循环的【序号】和【任务】配对
Threads.@threads for item in items
    ary[item.idx] = item.task + 1
end

运行说明

image.png

二、为每个线程分配一个收集结果的容器

比如你的CPU是8核,你的线程数为16
那么,为每个线程创建一个收集计算结果的容器,这样每个线程只对一个容器进行push、append等操作,不会产生数据竞争。
容器可以是数组,字典等,它可以增删查改,不像以上第一种,只能update。

#数组作为容器
tasks = rand(1000007)        #计算的任务
res_ary = [[] for _ in 1:Threads.nthreads()]
@time Threads.@threads for task in tasks
    rtn = task * 2  #dosomething()
    push!(res_ary[Threads.threadid()],rtn)
end

res_ary

运行说明

image.png
#字典作为容器
tasks = rand(1000007)        #计算的任务
res_ary = [Dict() for _ in 1:Threads.nthreads()]
@time Threads.@threads for task in tasks
    rtn = task * 2  #dosomething()
    res_ary[Threads.threadid()][task] = rtn
end

#所有的字典合并到一个字典
all_dict = Dict()
for d in res_ary
    merge!(all_dict,d)
end
all_dict

运行说明

image.png

三、官方的用法,用lock

tasks = rand(1000007)        #计算的任务
res_ary = Dict()
splock = Threads.SpinLock()
@time Threads.@threads for task in tasks
    rtn = task * 2  #dosomething()    
    lock(splock)
    try
        res_ary[task] = rtn
    finally
        unlock(splock)
    end        
end
res_ary

用锁的话,会增加消耗。我也没咋用过,后期增加。

相关文章

  • julia 多线程计算结果的收集(二)

    一、预分配空间,为每个任务定义一个单独的cell,存放计算结果 1、定义一个数组,数组的总个数(长度)就是for循...

  • 如何收集julia多线程运行后的计算结果

    一、julia的多进程PMAP会自动返回计算的结果集,但是多线程则没有这个自动功能 二、多线程涉及原子操作,对于计...

  • julia 多线程

    julia 多线程 julia本身是一门很快速的语言,但是现代计算机往往具有多核心多线程设计,因此,充分发挥硬件,...

  • Python多线程运行带多个参数的函数

    在python中经常会到用多线程处理某个函数来缩短运行时间。 运行上面的程序就会多线程处理并打印出输入x的计算结果...

  • 评Julia的《SunFlower》之一/二

    评Julia的《SunFlower》之一/二 Julia的文字,哪怕是寥寥几笔,总能勾起我作为观者的意象,比如这组...

  • 简单介绍垃圾收集器

    新生代垃圾收集器:Serial单线程收集器,主要用于新生代收集,采用复制算法ParNewSerial收集器的多线程...

  • Calling julia functions from pyt

    一、python调用julia的原理 二、使用的包:Pyjulia 三、环境搭建1、首先你确保你安装了julia2...

  • Go 不需要 Java 风格的 GC

    为什么 Go 不需要像 Java 和 C# 这样昂贵的垃圾收集器? Go、Julia 和 Rust 等现代语言不需...

  • IOS里的多线程编程详解

    以下是开发初期收集整理的一点资料 多线程之NSInvocationOperation 多线程编程是防止主线程堵塞,...

  • 垃圾收集器(一)

    jvm垃圾收集器按不同的角度似乎有几种分法。例如,按收集的区域有收集新生代和老生代的分别,按收集时是否多线程有串行...

网友评论

      本文标题:julia 多线程计算结果的收集(二)

      本文链接:https://www.haomeiwen.com/subject/qiyrtltx.html