goroutine study simply
This project is maintained by wangfakang
golang中的协程
所谓协程就是轻量级的线程,其实我理解的就是一个函数.
协成是比线程和进程更加轻量级的,就相当于一个函数一样.系统的开销小.
协成采用的是段拷贝的方式进行协成栈的管理的,我们都知道在c语言中的递归函数有时候会出现栈溢出, 原因就是每次都会为其分配新的函数栈空间当递归过多的话会发生溢出,而go解决了这个问题, 使用了段拷贝技术.
go function_name();
这就相当于启动了一个协程.语法很简单的.
在go语言中使用channel进行同步和通信.相当于linux中的管道.
1 package main
2 var a string
3 var c = make(chan int)
4 func f() {
5 a = "hello, world"
6 <-c
7 }
8
9 func main() {
10 go f()
11 c <- 0
12 print(a)
13
14 }
1 package main
2 var a string
3 var c = make(chan int,10)
4 func f() {
5 a = "hello, world"
6 c<-0
7 }
8
9 func main() {
10 go f()
11 <-c
12 print(a)
13
14 }
select是干什么的恩?大家都知道linux中的select poll epoll等,其实go中的select也差不多有类似的功能
只不过go 中的select是监听多个channel上是否有数据流动.即当有多个channel的时候可以使用select进行相
应的监听,当谁发生了则执行谁,当多个channel同时发生则进行随机的选择一个.
如下:
func main(){
c := make(chan int)
b := make(chan bool)
go func (){
for {
select {
case v := <-c:
printfln(v)
case <- time.After(5*time.Second):
b <- true
break
}
}()
<- b
}
上面函数就简单的实现了一个防止进入阻塞的情况.
func demo(input chan interface{}) {
t1 := time.NewTimer(time.Second * 5)
t2 := time.NewTimer(time.Second * 10)
for {
select {
case msg <- input:
println(msg)
case <-t1.C:
println("5s timer")
t1.Reset(time.Second * 5)
case <-t2.C:
println("10s timer")
t2.Reset(time.Second * 10)
}
}
}
值得注意的是:
这两个是一个全局的,而不像"case <- time.After(5*time.Second)",这是由于每次循环的时候重新执行 case 条件语句并重新注册到 select 中,因此这每次执行 select 的时候,都是启动了一个新的从头开始计 时的 Timer 对象,所以在这里定义了两个全局的.
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流