修改部分描述,添加必要的标点符号,补充代码超链接 (#804)

This commit is contained in:
Jck
2021-10-25 23:34:42 +08:00
committed by GitHub
parent d5578df00a
commit 39dbdb7094
100 changed files with 433 additions and 414 deletions

View File

@@ -1,8 +1,9 @@
# 14.14 并行化大量数据的计算
假设我们需要处理一些数量巨大且互不相关的数据项,它们从一个`in`通道被传递进来,当我们处理完以后又要将它们放入另一个`out`通道就像一个工厂流水线一样。处理每个数据项也可能包含许多步骤Preprocess预处理 / StepA步骤A / StepB步骤B / ... / PostProcess后处理
假设我们需要处理一些数量巨大且互不相关的数据项,它们从一个 `in` 通道被传递进来,当我们处理完以后又要将它们放入另一个 `out` 通道就像一个工厂流水线一样。处理每个数据项也可能包含许多步骤Preprocess预处理 / StepA步骤A / StepB步骤B / ... / PostProcess后处理
一个典型的用于解决按顺序执行每个步骤的顺序流水线算法可以写成下面这样:
```go
func SerialProcessData(in <-chan *Data, out chan<- *Data) {
for data := range in {
@@ -14,11 +15,12 @@ func SerialProcessData(in <-chan *Data, out chan<- *Data) {
}
```
一次只执行一个步骤,并且按顺序处理每个项目:在第1个项目没有被`PostProcess`并放入`out`通道之前绝不会处理第2个项目。
一次只执行一个步骤,并且按顺序处理每个项目:在第 1 个项目没有被 `PostProcess` 并放入 `out` 通道之前绝不会处理第 2 个项目。
如果你仔细想想,你很快就会发现这将会造成巨大的时间浪费。
一个更高效的计算方式是让每一个处理步骤作为一个协程独立工作。每一个步骤从上一步的输出通道中获得输入数据。这种方式仅有极少数时间会被浪费,而大部分时间所有的步骤都在一直执行中:
```go
func ParallelProcessData (in <-chan *Data, out chan<- *Data) {
// make channels:
@@ -34,6 +36,7 @@ func ParallelProcessData (in <-chan *Data, out chan<- *Data) {
go PostProcessData(StepCOut,out)
}
```
通道的缓冲区大小可以用来进一步优化整个过程。