首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Threads.@spawn和Threads.@Threads.有什么不同?

Threads.@spawn和Threads.@Threads.有什么不同?
EN

Stack Overflow用户
提问于 2020-05-20 12:28:10
回答 1查看 1.1K关注 0票数 5

我是一个对Julia语言感兴趣的新手程序员。文档(https://docs.julialang.org/en/v1/base/multi-threading/)说Threads.@Threads.是for "for“循环和thread。@spawn将给定的任务放在任何可用的线程上。我的理解是Threads.@Threads.在本质上是同步的,而threads.@spawn方法是异步的,需要更多的规划来实现(即使用fetch()方法)。

在我在网上发现使用这两种方法的代码中,我似乎看到这两种方法可以互换使用(从我的角度来看)。对于新手程序员来说,这两者在概念上有什么不同,我们应该如何/何时实现它们?此外,它们是否可以相互补充?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-20 14:30:20

考虑一下:

代码语言:javascript
复制
function withthreads()
    arr = zeros(Int, 10)
    Threads.@threads for i in 1:10
       sleep(3 * rand())
       arr[i] = i
    end
    println("with @threads: $arr")
end


function withspawn()
    arr = zeros(Int, 10)
    for i in 1:10
        Threads.@spawn begin
            sleep(3 * rand())
            arr[i] = i
        end
    end
    println("with @spawn: $arr")
end

function withsync()
    arr = zeros(Int, 10)
    @sync begin
        for i in 1:10
           Threads.@spawn begin
               sleep(3 * rand())
               arr[i] = i
           end
        end
    end
    println("with @sync: $arr")
end

withthreads()
withspawn()
withsync()

输出:

代码语言:javascript
复制
with @threads: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
with @spawn: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
with @sync: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

因此,@threads管理分配给julia的线程池,并为for循环的每次迭代派生最多一个线程(如果迭代次数多于线程,则在每个线程完成其分配的迭代时,可能会多次使用相同的线程进行多次迭代),还会同步线程,直到所有线程都完成时才退出for块。@spawn只产生一个任务线程,并立即返回到主任务,因此,一旦所有任务都产生了,甚至在它们完成工作之前,块就可以退出(因此在数组arr中,零仍然是0)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61905127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档