Go语言 goroutine是一把双刃剑
go中的goroutine是go语言在语言级别支持并发的一种特性。初接触go的时候对go的goroutine的欢喜至极,实现并发简便到简直bt的地步。但是在项目过程中,越来越发现goroutine是一个很容易被大家滥用的东西。goroutine是一把双面刃。这里列举一下goroutine使用的几宗罪: 1 goroutine的指针传递是不安全的
非常符合逻辑的代码: 主routine开一个routine把request传递给saveRequestToRedis1,让它把请求储存到redis节点1中 同时开另一个routine把request传递给saveReuqestToRedis2,让它把请求储存到redis节点2中 然后主routine就进入循环(不结束进程)
问题现在来了,saveRequestToRedis1和saveReuqestToRedis2两个函数其实不是我写的,而是团队另一个人写的,我对其中的实现一无所知,也不想去仔细看内部的具体实现。但是根据函数名,我想当然地把request指针传递进入。 好了,实际上saveRequestToRedis1和saveRequestToRedis2 是这样实现的:
|