Threads.@spawn和Threads.@threads有什么区别?



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

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

考虑:

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()

输出:

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(。

最新更新