Skip to content

20210210关于数据流动(1)对比现实河流聊聊关于数据流动的第一步“数据的分流”

zqy edited this page Feb 10, 2021 · 4 revisions

关于那句老话要用通信实现数据共享,而不是用数据共享实现通信
在这里先说结论,golang的数据流动的设计模式的规则之一是“用通信实现数据共享”,数据流动会涉及到很多环节,如基于管道的数据分发:

ch1 :=make(chan struct{})
ch2 :=make(chan struct{})
ch3 :=make(chan struct{})
ch4 :=make(chan bool)
go func(){
    defer close(ch1)
    defer close(ch2)
    defer close(ch3)
    defer close(ch4)
    for b := range some_exist_bool_chan{
        if b{
            ch1<-struct{}{}
            ch3<-struct{}{}
        }else{
            ch2<-struct{}{}
            ch4<-b
        }
    }
}()

如上例子为一个主数据流some_exist_bool_chan分裂成4个支流
数据流动虽然很像现实世界的河流与支流,但是有如下区别,区别还是很大的:
1.现实世界一旦分流新河流流量将减少,golang中不会
2.现实世界一旦截流某河流,其他分支流量将减增多,golang中不会

3.现实世界中分流就是分流,不会有这些花样,golang中分流代表了两件事:

首先是现实世界中的“分流”
另一件事是去“无中生有”一些新的数据基于这些数据实现分流所形成的支流,如上面的if b{ch1<-struct{}{};    ch3<-struct{}{}}

虽然这些“无中生有”的支流数据内容和源数据流无关,但是设计哲学上属于源数据流的支流,因为两者之间逻辑上构成了因果关系,更确切的说两者之间构成了“充要条件”

回到正题,数据流动的分流这一环节其实就是“通信实现数据共享”的具象化体现
go func(){for range{}}()这个线程函数(代码块)让一个本属于某线程的原子级数据(事件)从某管道里取出,然后让这个事件从“一个”变成“多个”,同时有“多少个”事件就会有“多少个”新线程去对接(承接)数据,这就是通信的具象化体现

而实现通信之后,实现数据共享就是顺其自然的事了

下一篇文章继续探讨之后的事

Clone this wiki locally