multithreading - 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)。
推荐阅读
- ios - 无效参数:PlatformPrincipal 无效
- c# - c# 将项目添加到对象列表中的对象列表中
- .net - 有没有办法在 .NET SFML 中获取 FloatRect 的视图?
- javascript - VueJS中如何防止Child组件中更新的数据更新Parent的数据[2.6.14]
- azure - Azure 数据工厂 - 表达式中的替换函数
- python - 无法使用 python 和 heroku postgres 在本地连接到 postgresql 数据库
- python-3.x - Python 和 pytest
- database - 数据库还是txt文件?
- reactjs - 使用日期时 Firebase 更新查询停止
- python - 如何使用 Twitter API Python 包装器“searchtweets-v2”调用带有元数据的历史推文