并发编程示例
定时任务
1 | func demo(input chan interface{}) { |
断续器
1 | func main(){ |
超时
1 | func main(){ |
自定义定时器
1 | func main(){ |
使用时间控制停止ticker
1 | func main(){ |
并发读取文件夹所有文件的长度(使用通道)
1 | func test1() { |
并发读取 文件夹所有文件的长度(使用sync.WaitGroup)
这个使用的其实就是计数器的道理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34func test1() {
dir := "./db"
paths, err := ioutil.ReadDir(dir)
check(err)
var files []string
for _, path := range paths {
if !path.IsDir() {
files = append(files, path.Name())
}
}
// sizes用来计算总长度和阻塞直至所有goroutine走完
sizes := make(chan int64)
// 计数器
var wg sync.WaitGroup
for _, file := range files {
wg.Add(1)
go func(fileName string) {
defer wg.Done()
fileInfo, _ := os.Stat(fmt.Sprintf("%s/%s", dir, fileName))
sizes <- fileInfo.Size()
}(file)
}
go func() {
wg.Wait()
close(sizes)
}()
var total int64
for size := range sizes {
fmt.Printf("size:%d\n", size)
total += size
}
fmt.Printf("total size: %d\n", total)
}
令牌-另一种信号计数器
1 | func check(err error) { |