作者最容易理解的定义是多个并发运行的进程,每个进程都是一系列相互关联的进程阶段的一部分。
类比是这样的:想象一下常规数据库自动备份的流程,其中有很多数据库需要备份。对于备份本身,我们使用 go 程序,而不是 shell 脚本。也许将要执行的一系列流程阶段概述如下。
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 是一系列进程,所以进程总是顺序的,而行代表一个序列。
在Go中,一般以goroutine形式执行的进程是并发的,但在流程中它必须是顺序的,它被称为管道,所以暂时假设管道A是进程的goroutine A、管道B是goroutine B等等。
为了更容易理解表格,请按照顺序说明:
在这个例子中,我们假设管道A只有一个goroutine,管道B也有一个goroutine,管道C也有一个goroutine。但实际上在现实世界的实现中,每个管道可以有很多goroutine(管道A有很多goroutine,管道 B 的许多 goroutine,管道 C 的许多 goroutine)。
我希望我的文字可以解释。即使不清楚,互联网也是开放的,有 LAN 资源。
以上是管道概念的详细内容。更多信息请关注PHP中文网其他相关文章!