golang之协程+chan通道

发布时间 2023-08-11 17:59:35作者: X-Wolf

 

[管道]

分为 有缓冲和无缓冲两种

无缓冲: 

1)接受者与发送者必然存在于两个协程, 否则会造成互相等待 死锁的情况

顺序执行多协程:

var ch1 = make(chan int)

    var stopFlag = make(chan bool)
    // 保证两个协程顺序执行

    go func() {
        fmt.Println("g1")
        time.Sleep(3 * time.Second)
        ch1 <- 1
    }()

    go func() {
        <-ch1
        fmt.Println("g2")
        time.Sleep(1 * time.Second)
        stopFlag <- true
    }()

    <-stopFlag
    fmt.Println("over")

 

有缓冲:

1.允许同一个协程中, 顺序执行, 但是保证发送的数量与接收的数量相等,否则会造成死锁

 

[协程]

实例:

go funct(){
    ...
}()

 

 

 

实现主进程Hold的方式

1)使用无缓冲的channel, 异常情况下实现终止操作,例如gin框架保证服务的异常中断之后的处理

2)使用select{} 即可