Engee 文档
Notebook

分布式计算

Engee提供了使用名为Distributed的库实现分布式计算的功能。 该库的工具有助于探索在可能驻留在不同计算核心上的单独线程中执行任务的可能性。

parallel_computing1.png

导入用于分布式计算的库:

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

使用Distributed库的Nworkers函数,您可以找出当前有多少进程可用。:

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

使用addprocs,您可以添加许多工作流。:

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

使用pmap

所有可用进程如何工作的一个例子是使用pmap函数。 Pmap函数通过使用可用的工作流和任务将f应用于每个项目来转换c**集合。

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

任何错误都可以停止pmap。 这可能导致指定的函数不
应用于集合中的所有项。 但是,可以使用以下方法处理这些错误
on_error参数。

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**在循环中并行执行任务和操作的示例。