首页 > 后端开发 > Golang > 正文

管道概念

王林
发布: 2024-07-17 17:24:07
原创
1287 人浏览过

作者最容易理解的定义是多个并发运行的进程,每个进程都是一系列相互关联的进程阶段的一部分。

类比是这样的:想象一下常规数据库自动备份的流程,其中有很多数据库需要备份。对于备份本身,我们使用 go 程序,而不是 shell 脚本。也许将要执行的一系列流程阶段概述如下。

  1. 我们需要一个必须备份的所有数据库的数据列表,以及它们的访问地址和凭据。
  2. 我们运行备份进程,可以按顺序(在 db1 之后、完成、继续 db2、继续 db3 等),也可以并行(db1、db2、db3 等。备份进程和其他进程同时运行)。
  3. 在每个数据库备份过程中,都会进行几个过程

A.对数据库执行转储操作,输出以许多文件的形式保存到文件夹中。
B. 然后将转储文件存档为 .zip 或 .tar .gz 格式(例如)
C. 存档文件被发送到备份服务器,例如 AWS S3。

如果您注意上述情况,如果许多数据库的备份过程并行完成,性能可能会更好。对此,作者表示同意。

如果每个数据库备份进程A、B、C并发运行就更好了,通过使三个进程(A、B、C)成为并发进程,那么I/O将提高效率。之后,在进程A、B和C之间,执行将保持顺序(因为它必须顺序运行。例如,如果先执行B,然后执行A,则不允许);然而,负责执行进程A的goroutine已经完成了。我们可以继续执行B(这是进程A的下一阶段)加上执行其他进程(另一个数据库);并联。所以处理 A 的 goroutine 不会闲置。

请注意以下可视化。该列表示同时运行的 goroutine。但因为这三个 goroutine 是一系列进程,所以进程总是顺序的,而行代表一个序列。

Image description

在Go中,一般以goroutine形式执行的进程是并发的,但在流程中它必须是顺序的,它被称为管道,所以暂时假设管道A是进程的goroutine A、管道B是goroutine B等等。

为了更容易理解表格,请按照顺序说明:

  1. 序列 1:管道 A 将从 db1 执行转储过程。同时,管道B和C处于空闲状态。 2.Sequence2:db1 dumy过程完成,进入下一阶段,即管道B执行db1数据转储过程,同时管道A执行db2转储过程。 C管道仍然闲置。
  2. 序列 3:管道 A 正在运行 db3 转储进程。同时,管道B尚未运行已转储的db2归档进程,因为归档db1尚未完成。管道仍然闲置。
  3. 序列4:db1归档过程完成,然后进入下一阶段,即将归档发送到备份服务器,该过程由管道C处理。同时管道B开始运行db2数据转储归档和管道A转储
  4. ...等等。

在这个例子中,我们假设管道A只有一个goroutine,管道B也有一个goroutine,管道C也有一个goroutine。但实际上在现实世界的实现中,每个管道可以有很多goroutine(管道A有很多goroutine,管道 B 的许多 goroutine,管道 C 的许多 goroutine)。

我希望我的文字可以解释。即使不清楚,互联网也是开放的,有 LAN 资源。

以上是管道概念的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板