Engee 文档
Notebook

分布式计算

Engee 通过一个名为 "分布式"的库提供了实现分布式计算的设施。该库中的工具可帮助您探索在不同计算核心上的独立线程中执行任务的可能性。

parallel_computing1.png

导入分布式计算库

In [ ]:
Pkg.add(["LinearAlgebra", "Distributed"])
In [ ]:
using Distributed

使用分布式库的nworkers函数,找出当前可用的进程数量:

In [ ]:
nworkers()
Out[0]:
1

使用 addprocs,你可以添加一定数量的工作进程:

In [ ]:
addprocs(2)
nworkers()
Out[0]:
2

使用 pmap

使用pMap函数就是所有可用工作流的一个例子。通过对每个元素应用fpMap函数利用可用的工作流和任务对c集合进行转换。

In [ ]:
pmap(x -> x*2, [1,2,3])
Out[0]:
3-element Vector{Int64}:
 2
 4
 6

任何错误都可能导致 pmap 停止运行。这可能导致指定函数无法 应用到集合的所有元素。不过,这些错误可以通过 **参数来处理这些错误。

In [ ]:
pmap(x -> iseven(x) ? error("foo") : x, 1:4; on_error=identity)
Out[0]:
4-element Vector{Any}:
 1
  ErrorException("foo")
 3
  ErrorException("foo")

也可以通过返回值来处理错误:

In [ ]:
even_or_zero = pmap(x->iseven(x) ? error("foo") : x, 1:4; on_error=ex->0)
Out[0]:
4-element Vector{Int64}:
 1
 0
 3
 0

使用 @distributed 宏

Julia 编程语言中的@distributed宏提供了在循环中并行化操作的能力。它允许你在不同的进程中迭代循环,从而加快代码的执行速度,尤其是在处理大量数据时。

使用@distributed宏的示例:

In [ ]:
@elapsed @sync @distributed for _ in 1:2
    sleep(2)
end
Out[0]:
2.450649919

在本例中,循环迭代是并行执行的,如果不使用该宏,循环执行时间将为 4 秒。

使用 @everywhere 宏

@everywhere 宏用于在并行计算中在所有可用处理器上执行代码,而无需明确指定每个进程。

本例将在所有可用于并行计算的处理器上执行,并输出随机矩阵 A 的特征值:

In [ ]:
@everywhere begin
    using LinearAlgebra
    A = rand()
    println((A))
end
0.7949660890678617
      From worker 2:	0.43047216493869567
      From worker 3:	0.6615365425334665

结论

本例演示了如何使用分布式库来实现分布式计算。举例说明了如何使用pMap函数、@distributed宏和@everywhere宏来并行执行循环中的任务和操作。