Engee 文档
Notebook

Julia语言中的并行计算

这个例子讨论了使用线程在Julia编程语言中实现并行计算。

导言

什么是并行计算?

并行计算是当它们在时间上可能部分重叠时同时执行多个任务的一种方式。 如果操作不直接相关并且可以并行执行,这尤其有用。

这种方法通常用于:

-性能优化
-同时处理多个任务
-处理网络请求或I/O操作

主要部分

创建将异步输出的单词数组

In [ ]:
words = ["Julia", "最好的", "语言", "编程"]
Out[0]:
4-element Vector{String}:
 "Julia"
 "лучший"
 "язык"
 "программирования"

创建一个函数,该函数将触发每个随机数秒

In [ ]:
function sleepprint(s)
    # 我们产生从0到1秒的延迟(默认情况下)
    sleep(rand())
    # 行输出到控制台
    println(s)
end
Out[0]:
sleepprint (generic function with 1 method)

这里有趣的一点是使用两个宏:

  • @async 在后台异步运行任务。
  • @sync 确保主进程在继续执行之前等待所有异步任务完成。

下一个循环在单独的任务中运行列表中的每个单词(Task)通过函数调用 sleepprint.

In [ ]:
# 我们运行所有异步任务五次。:
for i in 1:5
    println("\迭代号:$i")
    
    @sync for word in words
        # 对于每个迭代,我们创建一个异步任务
        @async sleepprint(word)
    end
end
Итерация №: 1
лучший
Julia
программирования
язык

Итерация №: 2
язык
программирования
лучший
Julia

Итерация №: 3
язык
программирования
Julia
лучший

Итерация №: 4
язык
Julia
лучший
программирования

Итерация №: 5
язык
программирования
Julia
лучший

因为 sleep(rand()) 生成不同的时间间隔,每次运行脚本时,行输出顺序可能会更改。

操作原理如下:

  1. 我们在说话 @sync 我们希望等待块内所有操作的结束;
  2. 然后为每个单词创建一个独立的映射。 @async 将启动的任务 sleepprint;
  3. 因为 sleep(rand()) 它由于各种原因而暂停,并且随机执行任务;
  4. 但多亏了 @sync 最重要的是,线程只有在完成所有这些任务后才能继续运行。

结论

我们回顾了Julia语言中并行计算的简单演示。 使用宏@async@sync 我们能够组织功能的竞争性执行 sleepprint,其中模拟了某种长期操作(人为延迟)。

这显示了在Julia中并行化最简单的任务是多么容易,而不必使用外部库。 该方法适用于需要比顺序更有效地执行多个独立操作(例如,访问数据库,读取文件,API调用)的情况,特别是如果这些操作需要等待外部资源。

该示例是使用[Rosetta代码]的材料开发的(https://rosettacode.org/wiki/Concurrent_computing