Table of Contents generated with DocToc
区块链是构建在P2P网络之上,在P2P网络中:
- 一个节点即可以是服务器也可以是客户端,被称为Host,
- 和本节点连接的所有节点都被称为Peer。
具体的场景是:Host需要保存所有建立连接的Peer,并对这些Peer进行维护:增加和删除Peer,并且提供Peer的查询和向所有Peer广播消息的接口
Host有4个方法,分别是:
- AddPeer: 增加1个Peer。
- RemovePeer: 删除1个Peer。
- GetPeer: 通过Peer.ID查询1个Peer。
- BroadcastMsg: 向所有Peer发送消息。
don't (let computations) communicate by sharing memory, (let them) share memory by communicating (through channels)
When goroutines communicate by sharing memory, we use traditional concurrency synchronization techniques, such as mutex locks, to protect the shared memory to prevent data races.
使用锁共享数据.
把数据流动画出来,并把要流动的数据标上,然后那些数据流动的线条,就是channel,线条上的数据就是channel要传递的数据,图中也把这些线条和数据标上了.
GetPeer是双向的: 有很多goroutine调用GetPeer,我们需要向每一个goroutine发送结果,这就需要每一个goroutine都需要对应的1个接收结果的channel。
版本一:使用锁共享数据, 版本二:使用channel传输数据,没办法实现GetPeer 版本三:使用channel传输函数,不能对Peer进行同时读,不容易做单元测试
这3种方式本身并无优劣之分,具体要用那种实现,要依赖自身的实际场景进行取舍