go goroutines 使用小结
go +方法 就实现了一个并发,但由于环境不同,需要对并发的个数进行限制,限制同一时刻并发的个数,后面称此为“并发限流”。
为什么要并发限流?
虽然GO M+P+G的方式号称可以轻松支持上万的并发,但并不代表你的环境就可以这么任性的不限制并发。
因为每个并发中都会消耗一定的资源,GO支持的起,系统环境本身支撑不起。
支撑不起,就会出现进程崩溃、卡死等一系列我们不愿意看到的结果
解决方式
写一个公共的并发限流模块,将要调用的任务通过参数输入。
代码示例
待完善...
并行理解举例
func getNums(i *int) chan int{ c1 := make(chan int) go func(i *int) { c1 <- *i *i = *i + 1 }(i) return c1 }
var i = 0 a := <- getNums(&i) //fmt.Print(a,i) fmt.Println(a) fmt.Println("i:",i) a = <- getNums(&i) //fmt.Print(a,i) fmt.Println(a) fmt.Println("i:",i)
这样的输出结果是不确定的,会有以下两种结果
0 i: 0 1 i: 2
0 i: 1 1 i: 2
主要看这两行代码执行与主程序打印执行的时机,谁先谁后
c1 <- *i *i = *i + 1
下面这种写法,输出结果将是唯一的
func getNums(i *int) chan int{ c1 := make(chan int) go func(i *int) { *i = *i + 1 c1 <- *i }(i) return c1 }