• 003、GO之并发


    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())//耗时0
    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 }

    05、使用select读取多个通道

     1 package main
     2 
     3 import (
     4     "fmt"
     5 )
     6 
     7 func main() {
     8     c1, c2 := make(chan int), make(chan string)
     9     go func() {
    10         for {
    11             select {
    12             case v1, ok := <-c1://关闭后,每次ok都为false。多个case时,随机执行一个
    13                 if ok {
    14                     fmt.Println("C1的值为:", v1)
    15                 }
    16             case v2, ok := <-c2:
    17                 if ok {
    18                     fmt.Println("c2的值为:", v2)
    19                 }
    20             }
    21         }
    22     }()
    23     c1 <- 1
    24     c2 <- "abc"
    25     close(c1)
    26     close(c2)
    27 }

    06、空的select会阻塞协程

     1 package main
     2 
     3 import (
     4     "fmt"
     5     "time"
     6 )
     7 
     8 func main() {
     9     for {
    10         fmt.Println("当前时间:", time.Now())
    11     }
    12     select {}
    13 }

    07、select超时退出

     1 package main
     2 
     3 import (
     4     "fmt"
     5     "time"
     6 )
     7 
     8 func main() {
     9     c := make(chan bool)
    10     select {
    11     case <-c:
    12     case <-time.After(3*time.Second):
    13         fmt.Println("超时退出")
    14     }
    15 }
  • 相关阅读:
    (转 )Unity对Lua的编辑器拓展
    unity timeline
    unity拖尾粒子问题
    unity shader 波动圈
    linux教程
    Unity Shader 基础
    ugui拖拽
    unity shader 热扭曲 (屏幕后处理)
    英文取名神器
    lua正则表达式替换字符串
  • 原文地址:https://www.cnblogs.com/geniushuangxiao/p/12817350.html
Copyright © 2020-2023  润新知