码迷,mamicode.com
首页 > 其他好文 > 详细

golang中sync和channel同步机制

时间:2015-08-31 17:39:55      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

sync实例:

package main

import (
"fmt"
"sync"
)

var waitgroup sync.WaitGroup

func Afunction(shownum int) {
fmt.Println(shownum)
waitgroup.Done() //任务完成,将任务队列中的任务数量-1,其实.Done就是.Add(-1)
}

func main() {
for i := 0; i < 10; i++ {
waitgroup.Add(1) //每创建一个goroutine,就把任务队列中任务的数量+1
go Afunction(i)
}
waitgroup.Wait() //.Wait()这里会发生阻塞,直到队列中所有的任务结束就会解除阻塞
}

无缓存的channel实例:

package main

import "fmt"

func Afuntion(ch chan int) {
fmt.Println("finish")
<-ch
}

func main() {
ch := make(chan int) //无缓冲的channel
go Afuntion(ch)
ch <- 1

// 输出结果:
// finish
}

 

有缓存的channel实例:

package main

import "fmt"

func main() {
    var ch = make(chan int, 20)
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
    //ch <- 11 //panic: runtime error: send on closed channel
    for i := range ch {
        fmt.Println(i) //输出0 1 2 3 4 5 6 7 8 9
    }
}

超时处理channel实例:

package main

import (
    "fmt"
    "time"
)

func main() {
    c := make(chan int)
    o := make(chan bool)
    go func() {
        for {
            select {
            case i := <-c:
                fmt.Println(i)
            case <-time.After(time.Duration(3) * time.Second):    //设置超时时间为3s,如果channel 3s钟没有响应,一直阻塞,则报告超时,进行超时处理.
                fmt.Println("timeout")
                o <- true
                break
            }
        }
    }()
    <-o
}

 

 

golang中sync和channel同步机制

标签:

原文地址:http://my.oschina.net/ifraincoat/blog/499589

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!