golang初学,goroutine+channel或goroutine+sync.WaitGroup(欢迎指正,小白勿喷.....)

1,并发     goroutine + channel

(1)goroutine   go协程

相当于子进程  ,main函数为主协程 ,也是一个协程

当main函数结束时,go协程没有进行阻塞处理(如。channel、),那么go协程就不会被执行   除非在main协程加入 延时,(用来等待go协程结束用的)

func main() {

    go func(){

        fmt.Println("111")

    }()

    fmt.Println("222")

}

结果为

root@sun:~/go-basic# go run run.go 
222

加入time.Sleep

func main() {

    go func(){

        fmt.Println("111")

    }()

    fmt.Println("222")

    time.Sleep(time.Second)

}

结果为

root@sun:~/go-basic# go run run.go 
222
111

(2)channel   通道

Golang基础(9):goroutine协程和channel通道 - 九卷 - 博客园

(select监听channel数据, 超时处理等)

       

      一、无缓存通道

      Ch := make(chan int)

      特性:无缓存channel 写入一条通道后,就会直接堵塞,直到等待被读取

      二,有缓存通道

      Ch := make(chan int,5)    多个了参数5

      特性:当写入5条数据后,若仍未进行读取、取出,就会堵塞

     

range作为读取,close关闭通道

func writeCh(ch chan int){

    for i:=0;i<5;i++{

        ch <- i

    }

    close(ch)

}

func main(){

    ch := make(chan int,5)

    go writeCh(ch)

    for p:=range ch {

        fmt.Println(p)

    }

}

2,goroutine+ sync.WaitGroup

第一条中用sleep或者channel来阻塞,使得goroutine被执行的另一个思路

首先有4个步骤

var wg sync.WaitGroup  

wg.Add(100)   将运行的次数设置为100

wg.Done()      调用一次,Add的次数-1

wg.Wait()      被调用时,会堵塞,直到Add值为0时,才会继续往下进行

func f(){

    fmt.Println("go func")
}



func main(){

    go f()

    fmt.Println("main func")

}

此时只打印出 main func

import (

    "fmt"

    "sync"

    // "time"

)



func f(wg *sync.WaitGroup){

    for i:=0;i<10;i++ {

        fmt.Println(i)

        wg.Done()

    }

}


func main(){

    var wg sync.WaitGroup

    wg.Add(10)

    go f(&wg)

    fmt.Println("main func")

    wg.Wait()

}

打印出

root@sun:~/go-basic# go run run.go

main func

0123456789

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值