golang channel 12

青旅半醒 2022-12-10 07:27 323阅读 0赞

1.启动设置运行线程数

  1. func main() {
  2. //环境变量位置
  3. root := runtime.GOROOT()
  4. //当前操作系统
  5. system := runtime.GOOS
  6. fmt.Println(root ,system)
  7. //获取服务器线程数
  8. num := runtime.NumCPU()
  9. //设置运行线程数
  10. runtime.GOMAXPROCS(num -1)
  11. fmt.Println("cpu",num -1)
  12. }

2.go

  1. /*
  2. go test("并发") 理解为开的一个协程,主线程执行完毕时,协程也会跟着停止
  3. */
  4. func main() {
  5. go test("并发") //不会输出(主线程执行完毕时,协程也会跟着停止)
  6. test("普通") //执行在前面
  7. //time.Sleep(1)
  8. }
  9. func test(a string){
  10. fmt.Println("我是:",a)
  11. }

3.WaitGroup 预备跑

  1. /*
  2. 等待所有协程完成会执行,预备跑
  3. */
  4. func group(){
  5. var wg sync.WaitGroup
  6. wg.Add(5)
  7. fmt.Println("预备")
  8. for i := 0; i < 5; i = i + 1 {
  9. //wg.Add(1)
  10. go func(n int) {
  11. defer wg.Done() //等价于 defer wg.Add(-1)
  12. time.Sleep(2)
  13. fmt.Println(n)
  14. }(i)
  15. }
  16. wg.Wait()
  17. fmt.Println("跑")
  18. }

4.chan

  1. 1.全局变量和锁同步
  2. 2.Channel(先进先出、线程安全、 channel是有类型的)
  3. 声明
  4. var 变量名 chan 类型
  5. var test chan int
  6. var test chan string
  7. var test chan map[string]string
  8. var test chan stu
  9. var test chan *stu
  10. 初始化
  11. var test1 = chan int
  12. test1 = make(chan int) //只能存一个参数
  13. test2 = make(chan int, 10) //可以存10个参数
  14. func main() {
  15. //chan简单使用
  16. intChan := make(chan int, 10)
  17. go write(intChan)
  18. go read(intChan)
  19. time.Sleep(time.Second * 5)
  20. }
  21. func write(ch chan int) {
  22. for i := 0; i < 100; i++ {
  23. ch <- i
  24. fmt.Println("put data: ", i)
  25. }
  26. }
  27. func read(ch chan int) {
  28. for {
  29. var b int
  30. b = <-ch
  31. fmt.Println(b)
  32. time.Sleep(time.Second)
  33. }
  34. }

5.select

  1. /*
  2. select
  3. 一个循环监听多个channel
  4. */
  5. func selectR() {
  6. var ch chan int
  7. ch = make(chan int, 10)
  8. ch2 := make(chan int, 10)
  9. go func() {
  10. var i int
  11. for {
  12. ch <- i
  13. time.Sleep(time.Second)
  14. ch2 <- i * i
  15. time.Sleep(time.Second)
  16. i++
  17. }
  18. }()
  19. for {
  20. select {
  21. case v := <-ch:
  22. fmt.Println(v)
  23. case v := <-ch2:
  24. fmt.Println(v)
  25. case <-time.After(time.Second): //定时器,1秒钟后执行
  26. fmt.Println("get data timeout")
  27. time.Sleep(time.Second)
  28. }
  29. }
  30. }

发表评论

表情:
评论列表 (有 0 条评论,323人围观)

还没有评论,来说两句吧...

相关阅读

    相关 golangchannel的超时

    基本语法 通道声明和初始化 我们可以通过`chan`关键字来声明通道类型变量 var ch chan int // 声明一个通道类型变量 ch,并且通道

    相关 golang channel 的使用

    本文对channel使用中的几个疑惑,以例子的形式加以说明。 普通channel 缺省情况下,发送和接收会一直阻塞着,直到另一方准备好. 例如: pack

    相关 golangChannel

    Channel是Go中的一个核心类型,可以将其看成一个管道,通过它并发单元就可以发送或者接收数据进行通信(communication)。 `Do not communicat