for-loop - Julia - 是否可以在同一个 for 循环中使用进度条和 Threads.@threads?

标签 for-loop parallel-processing progress-bar julia

假设我有这个 for 循环:

for i in 1:100000
   1+1 
   # Let's do some long computations here
end

这两个 for 循环有效:

Threads.@threads for i in 1:100000
   1+1 
   # Let's do some long computations here
end

using ProgressMeter
@showprogress 1 "Computing..." for i in 1:100000
   1+1 
   # Let's do some long computations here
end

但以下均无效:

@showprogress 1 "Computing..." Threads.@threads for i in 1:100000
   1+1 
   # Let's do some long computations here
end

using ProgressMeter
Threads.@threads @showprogress 1 "Computing..." for i in 1:100000
   1+1 
   # Let's do some long computations here
end

那么在 Julia 中是否有可能在 for 循环和进度条中具有并行性?

最佳答案

此代码运行良好:

using ProgressMeter
N = 200
p = Progress(N);
update!(p,0)
jj = Threads.Atomic{Int}(0)

l = Threads.SpinLock()
Threads.@threads for i in 1:N
   sum(rand(10_000_000)) # some big computation
   Threads.atomic_add!(jj, 1)
   Threads.lock(l)
   update!(p, jj[])
   Threads.unlock(l)  
end

如果您不想使用锁,您也可以考虑仅在第一个线程上更新(但在这种情况下进度条运行不那么流畅):

Threads.threadid() == 1 && update!(p, jj[])

关于for-loop - Julia - 是否可以在同一个 for 循环中使用进度条和 Threads.@threads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56599196/

相关文章:

java - 使用 Java 流收集在 `for` 循环中生成的对象

javascript - 如何使 for 循环与变量内的变量一起工作

Java:如何防止使用条件语句将重复项添加到 ArrayList 中?

Cuda 编程 - 将嵌套结构传递给内核

javascript - 如何使用 for 循环创建多个进度条?

javascript - 如何让进度条获取文本类型输入的值?

Windows 批处理脚本 - 一次执行一个命令

java - 两个双核处理器系统的并行性

c - 并行运行代码的潜在危险

javascript - Progressbar.js - 如何获得第二个圆圈?