首页 > 其他 > 详细

003、GO之并发

时间:2020-05-02 13:54:36      阅读:27      评论:0      收藏:0      [点我收藏+]

01、使用chan控制程序结束

package main

import "fmt"

func main() {
    c := make(chan bool)
    go func() {
        fmt.Println("hello")
        c <- true
    }()
    <-c
}

02、遍历chan

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     c := make(chan bool)
 7     go func() {
 8         fmt.Println("hello")
 9         c <- true
10         close(c)//不手动关闭chan,会导致for循环无法结束,go所有协程都在等待导致死锁,从而崩溃
11     }()
12     for v :=range c {
13         fmt.Println("chan的值", v)
14     }
15 }

 03、chan无缓存时,是同步的,写了,需要被读。若有缓存,则写了,不一定需要被读

 1 package main
 2 
 3 import "fmt"
 4 
 5 func main() {
 6     c := make(chan bool, 1)//指定了大小,有缓存
 7     go func() {
 8         fmt.Println("hello")
 9         <-c
10     }()
11     c <- true//因为有缓存,读不到,则直接结束
12 }

 04、控制10个协程执行完成后程序退出

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "time"
 6 )
 7 
 8 func main() {
 9     now := time.Now()
10     defer fmt.Println("耗时不用函数", time.Now().Sub(now).Seconds())
11     defer func() {
12         fmt.Println("耗时用函数", time.Now().Sub(now).Seconds())
13     }()
14     
15     c := make(chan bool, 10)
16     for i := 0; i < 10; i ++ {
17         go hello(c, i)
18     }
19     for i := 0; i < 10; i++ {
20         <-c
21     }
22 }
23 
24 func hello(c chan bool, index int) {
25     fmt.Println("hello, ", index)
26     c <- true
27 }

 

003、GO之并发

原文:https://www.cnblogs.com/geniushuangxiao/p/12817350.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!