这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
go的并发如何理解
实际上就是吃透所谓的协程概念,首先要确定的共识就是一整个go程序对应一个线程,但可以对应多个协程,而这些协程在没有利用信道之间进行通信时是相互独立的,而我们的main函数就是一个主协程,它的关闭将会导致全部附属于它的协程关闭,所以我们需要用类似于下面的手段阻止其关闭
time.Sleep(time.Second)
//---------------------------
var wq sync.WaitGroup
wq.Add(1)
go func(word string) {
defer wq.Done()
query1(word)
}(word)
go func(word string) {
defer wq.Done()
query(word)
}(word)
wq.Wait()
fmt.Println("---------")
如果有做过第一天的作业的人,不知道会不会和我一样印象深刻,就是利用go关键字会导致代码出现空间上的不一致,就比如上面的那段代码,这是我的作业的一部分,我在输出结果时,总是首先进行打印“-----------”,然后才是进行query,这是因为无论是query1还是query,都需要等待对方服务器的响应,所以会慢于分割线的出现,其次query的访问速度大于query1,所以即便query1在前面,仍然会是query先执行完成,所以我们可以将上述代码中的go独立出来当作一个新的副main函数,而这个过程,很像异步
测试
我对这个测试真的是无语了,我在win下无论如何都调不动-benchmen这种参数,然后被迫转战wsl进行测试,我人也是真麻了,以后不说别的人,只要运行跑这个玩意我就直接wsl了,然后有关于wsl怎么安装请参照下面的链接zhuanlan.zhihu.com/p/466001838
有关于如何在wsl里去访问win上的文件
cd /mnt进入我们的win系统,然后ls一下,看下要进入哪个盘,接着反正就是cd之类的,go之类的
有关于性能调优
建议好好看这个链接blog.wolfogre.com/posts/go-pp…
在go文件的main函数中引入这个包就行
import "_ "net/http/pprof""
如何看可以查看哪些数据
进这里
http://localhost:6060/debug/pprof/
如何指定自己使用的工具
go tool pprof http://localhost:6060/debug/pprof/profile
如何使用web
web命令需要graphviz,附个链接自用graphviz.org/download/,记…
然后如果你在装之前就已经是在用goland的话,它的终端是识别不出来你的web命令的,所以,建议直接关掉goland再来一次
然后还有,我不用wsl的原因是我不知道这个文件存在wsl哪里,裂开
一些细碎的知识点
-
var ( x int64 lock sync.Mutex )这种做法有什么作用,最大的最用就是帮你省了在每个变量前加var的操作,如果不用var,你就得这么声明变量
var x int64 var lock sync.Mutex