zoukankan      html  css  js  c++  java
  • golang 部分理解:关于channel 和 goroutine 例子

    部分理解:关于channel 和 goroutine 例子
    package main import
    "strconv" import "fmt" func main() { //在主goroutine中要先有读取chan的请求,之后才可以赋值,即有需求才会有chan赋值的举动,否则先别碰chan,不然会死锁 //1 taskChan := make(chan string, 3) doneChan := make(chan int, 1) for i := 0; i < 3; i++ { taskChan <- strconv.Itoa(i) fmt.Println("send: ", i) } go func() { for i := 0; i < 3; i++ { task := <-taskChan fmt.Println("received: ", task) } doneChan <- 1 }() <-doneChan // 2和3是一对,只是把给chan的赋值或是读值调换了 //2 ch2 := make(chan int)
    //ch2 <- 1 如果在这先给ch2赋值,那么就会阻塞,因为不知道有谁在用这个ch2. go func() {
    <-ch2 fmt.Println("chan 2 received") }() ch2 <- 1 //放置在这儿刚好了 fmt.Println("over") //3 ch3 := make(chan int) go func() { ch3 <- 1 fmt.Println("chan 3 received") }() <-ch3 //这是告诉主goroutine有一个叫ch3的chan需要等待,等到ch3完成后,就可以继续往下走了 fmt.Println("over")

    //3
         //带缓存的chan,需要把缓存装满后才能继续后续
        c2 := make(chan int, 2)
        //写数据位置1  此处赋值会死锁
        c2 <- 1
        c2 <- 3
        c2 <- 2
        go func() {
            fmt.Println("before 2 received")
            <-c2
            fmt.Println("after 2 received")
        }()
        //写数据位置2 此处是正确位置

        fmt.Println("end")

    }

     最后还有个问题,goroutine中在去嵌套goroutine会怎么样?

  • 相关阅读:
    打开模拟器genymotion 的设置 查询设置的包名
    python 地板除 向下取整 取比目标结果小的的最大整数
    python 复数
    python 0.1+0.2 不等于0.3 的处理办法
    python 利用随机数的种子,复现随机数
    小程序 单独页面的js文件里设置 数据绑定
    问题集
    2020软件工程个人作业06——软件工程实践总结作业
    2020软件工程作业05
    2020软件工程作业04
  • 原文地址:https://www.cnblogs.com/rojas/p/4398695.html
Copyright © 2011-2022 走看看