分布式计算¶
Engee 通过一个名为 "分布式"的库提供了实现分布式计算的设施。该库中的工具可帮助您探索在不同计算核心上的独立线程中执行任务的可能性。
导入分布式计算库
In [ ]:
Pkg.add(["LinearAlgebra", "Distributed"])
In [ ]:
using Distributed
使用分布式库的nworkers函数,找出当前可用的进程数量:
In [ ]:
nworkers()
Out[0]:
使用 addprocs,你可以添加一定数量的工作进程:
In [ ]:
addprocs(2)
nworkers()
Out[0]:
使用 pmap¶
使用pMap函数就是所有可用工作流的一个例子。通过对每个元素应用f,pMap函数利用可用的工作流和任务对c集合进行转换。
In [ ]:
pmap(x -> x*2, [1,2,3])
Out[0]:
任何错误都可能导致 pmap 停止运行。这可能导致指定函数无法 应用到集合的所有元素。不过,这些错误可以通过 **参数来处理这些错误。
In [ ]:
pmap(x -> iseven(x) ? error("foo") : x, 1:4; on_error=identity)
Out[0]:
也可以通过返回值来处理错误:
In [ ]:
even_or_zero = pmap(x->iseven(x) ? error("foo") : x, 1:4; on_error=ex->0)
Out[0]:
使用 @distributed 宏¶
Julia 编程语言中的@distributed宏提供了在循环中并行化操作的能力。它允许你在不同的进程中迭代循环,从而加快代码的执行速度,尤其是在处理大量数据时。
使用@distributed宏的示例:
In [ ]:
@elapsed @sync @distributed for _ in 1:2
sleep(2)
end
Out[0]:
在本例中,循环迭代是并行执行的,如果不使用该宏,循环执行时间将为 4 秒。
使用 @everywhere 宏¶
@everywhere 宏用于在并行计算中在所有可用处理器上执行代码,而无需明确指定每个进程。
本例将在所有可用于并行计算的处理器上执行,并输出随机矩阵 A 的特征值:
In [ ]:
@everywhere begin
using LinearAlgebra
A = rand()
println((A))
end
结论¶
本例演示了如何使用分布式库来实现分布式计算。举例说明了如何使用pMap函数、@distributed宏和@everywhere宏来并行执行循环中的任务和操作。