14.9 Future 模式

Kesa...大约 1 分钟

14.9 Future 模式

future模式: 在使用某值之前需要先对其进行计算。

Futures 模式通过闭包和通道可以很容易实现,类似于生成器,不同地方在于 Futures 需要返回一个值。

假设我们有一个矩阵类型,我们需要计算两个矩阵 A 和 B 乘积的逆,首先我们通过函数 Inverse(M) 分别对其进行求逆运算,再将结果相乘。如下函数 InverseProduct() 实现了如上过程:

func InverseProduct(a Matrix, b Matrix) {
    a_inv := Inverse(a)
    b_inv := Inverse(b)
    return Product(a_inv, b_inv)
}

这两个求逆运算其实可以并行执行的。换句话说,调用 Product() 函数只需要等到 a_invb_inv 的计算完成。如下代码实现了并行计算方式:

func InverseProduct(a Matrix, b Matrix) {
    a_inv_future := InverseFuture(a)   // start as a goroutine
    b_inv_future := InverseFuture(b)   // start as a goroutine
    a_inv := <-a_inv_future
    b_inv := <-b_inv_future
    return Product(a_inv, b_inv)
}
func InverseFuture(a Matrix) chan Matrix {
    future := make(chan Matrix)
    go func() {
        future <- Inverse(a)
    }()
    return future
}

当开发一个计算密集型库时,使用 Futures 模式设计 API 接口是很有意义的。在你的包使用 Futures 模式,且能保持友好的 API 接口。此外,Futures 可以通过一个异步的 API 暴露出来。这样你可以以最小的成本将包中的并行计算移到用户代码中。

上次编辑于:
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.2