golang p2p网继续进入下一个初始化
n.netService, err = nebnet.NewNebService(n)
if err != nil {
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Fatal("Failed to setup net service.")
}
netservice有两个成员
type NebServicestruct {
node*Node
dispatcher *Dispatcher
}
跳出stup()函数
先进入start()函数看一看
if err := n.netService.Start(); err != nil {
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Fatal("Failed to start net service.")
}
进入netservice.start()
func (ns *NebService) Start() error {
logging.CLog().Info("Starting NebService...")
// start dispatcher.
ns.dispatcher.Start()
// start node.
if err := ns.node.Start(); err != nil {
ns.dispatcher.Stop()
logging.CLog().WithFields(logrus.Fields{
"err": err,
}).Error("Failed to start NebService.")
return err
}
logging.CLog().Info("Started NebService.")
return nil
}
可以看到第一个start()go语言断言用法的函数是dispatcher.start()
进入dispatch.start()
func (dp *Dispatcher) Start() {
logging.CLog().Info("Starting NebService Dispatcher...")
go dp.loop()
}
然后就出现一个新的线程、goruntime
go dp.loop()
进入该线程go语言断言用法,看它干go语言断言用法了些什么
timerChan := time.NewTicker(time.Second).C
for {
select {
case -timerChan:
metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))
case -dp.quitCh:
logging.CLog().Info("Stoped NebService Dispatcher.")
return
case msg := -dp.receivedMessageCh:
msgType := msg.MessageType()
v, _ := dp.subscribersMap.Load(msgType)
if v == nil {
continue
}
m, _ := v.(*sync.Map)
m.Range(func(key, valueinterface{}) bool {
select {
case key.(*Subscriber).msgChan - msg:
default:
logging.VLog().WithFields(logrus.Fields{
"msgType": msgType,
}).Warn("timeout to dispatch message.")
}
return true
})
}
}
一个有点长的循环
metricsDispatcherCached.Update(int64(len(dp.receivedMessageCh)))一秒钟刷新一次缓冲区
case msg := -dp.receivedMessageCh:
msgType := msg.MessageType()如果能取出dp.receivedMessageCh
msgType := msg.MessageType()首先判断取出的信息类型
v, _ := dp.subscribersMap.Load(msgType)
if v == nil {
continue
}
根据类型取出相应的map
如果取不出go语言断言用法,那么使用continue结束这个case
m, _ := v.(*sync.Map)
断言
m.Range(func(key, valueinterface{}) bool {
select {
case key.(*Subscriber).msgChan - msg:
default:
logging.VLog().WithFields(logrus.Fields{
"msgType": msgType,
}).Warn("timeout to dispa+tch message.")
}
return true
})
将msg推入其他管道里面去 。其他goruntime会循环等待该
《Go语言程序设计》epub下载在线阅读,求百度网盘云资源《Go 语言程序设计》(Mark Summerfield)电子书网盘下载免费在线阅读
资源链接:
链接:
提取码:br6t
书名:Go 语言程序设计
作者:Mark Summerfield
译者:许式伟
豆瓣评分:6.9
出版社:人民邮电出版社
出版年份:2013-8-1
页数:354
内容简介:
国外最经典的Go语言著作,Go语言编程的先驱者Mark Summerfield的实践经验总结 。
这是一本Go语言实战指南,帮你了解Go语言 , 按Go语言的方式思考,以及使用Go语言来编写高性能软件 。
作者展示了如何编写充分利用Go语言突破性的特性和惯用法的代码 , 以及Go语言在其他语言之上所做的改进,并着重强调了Go语言的关键创新 。
推荐阅读
- word转ppt在线转,word转换ppt文档怎么操作
- 收单e贷如何营销,收单e贷营销话术
- 哪个网站可以查gis数据,gis数据免费的网站
- 英雄联盟b站独家直播,lol b站
- vb.net属性写法 vbnet ui
- c语言结构化是什么,c语言的结构化实现
- iphone格斗单机游戏,苹果单机格斗闯关游戏
- linux中输出曾经命令,linux输出指定内容
- java关闭窗口一段代码 java关闭窗体代码