golang协程的使用-2018-11-06

栏目: Go · 发布时间: 6年前

内容简介:一般直接在要执行的函数前,加上 go 就是启用了一个执行该函数的协程。比如下面的小例子,启动say函数的协程。这样已经是在main函数中启动了一个协程,去执行say函数。但是结果却什么都没打印出来。

1. 创建一个协程

一般直接在要执行的函数前,加上 go 就是启用了一个执行该函数的协程。

比如下面的小例子,启动say函数的协程。

package main

import (
    "fmt"
    "time"
)

func say(s string) {
    fmt.Println(s)
}

func main() {
    for i := 0; i < 5; i++ {
        go say("Hello")
    }
}

这样已经是在main函数中启动了一个协程,去执行say函数。但是结果却什么都没打印出来。

后来理解了一下,go启动了一个协程,启动之后,系统不会阻塞,程序可以继续执行后面的流程。这个go协程启动之后,后面直接到了main函数的结束的地方,所以main函数直接结束了,但是协程启动的函数还没来得及执行,所以没有任何信息输出。

可以再main函数结束前,加1s的等待,这样在等待的过程中,协程启动的函数也就执行完输出了结果,最终main函数结束。

func main() {
    for i := 0; i < 5; i++ {
        go say("Hello")
    }
    time.Sleep(time.Second * 1)
}

这也是golang中协程使用需要注意的一个点吧。启动了之后,要注意被启动的函数的正常执行,当所有协程执行完成后,才让main函数退出。

需要 配合 channel 或者 waitgroup 去使用协程,阻塞主程序的退出。

2. 配合waitGroup启动协程

  • 定义一个WaitGroup对象wg。注意这里是一个全局的变量,使用时都是这个变量的内容,所以不需要定义为指针类型,否则这样声明会是个空指针。
  • wg.Add(n),n是正整数是说有几个协程要处理
  • wg.Done(),他就相当于wg.Add(-1),执行完一次go协程的函数,可以启动一次wg.Done(),n也就-1了。
  • wg.Wait(),是告诉主函数去等一等,等到全部的协程执行完,也就是最终总的n为0的时候,所有的协程都处理完了,main函数结束。
package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func say(s string) {
    defer wg.Done()
    fmt.Println(s)
}

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go say("Hello")
    }
    wg.Wait()
}

3.配合channel使用协程

上面使用了waitgroup,可以满足所有的协程执行完后,在退出主程序。我们还要学会配合channel去使用协程。

因为我们刚才是直接打印的协程启动的函数里的数据,但是并没有实现数据的传输。channel就是处理协程的数据传输的通道了。

关于channel的用法以后可以再其他文章中补充,这里就直接看怎么能结合goroutine了。

  • 初始化一个channel,有缓冲
  • 启动协程时,在函数中通过channel写入传的参数。
  • 读取channel中的数据
package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup
var ch = make(chan int, 5)

func say(s int) {
    defer wg.Done()
    ch <- s //将s写入ch
    fmt.Println("写入:", s)
}

func main() {
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go say(i)
    }
    wg.Wait() //所有协程执行完了,数据都写入了
    close(ch) //关闭ch
    for v := range ch {
        //遍历出ch中的值
        fmt.Println("v", v)
    }
}

当然,channel的使用还有很多坑,也需要注意,以后遇到记录


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

人工智能的未来

人工智能的未来

Jeff Hawkins、Sandra Blakeslee / 贺俊杰、李若子、杨倩 / 陕西科学技术出版社 / 2006.1 / 18.5

陕西科技出版社最新引进美国图书《人工智能的未来》(On Intelligence)一书,是由杰夫•霍金斯,一位在硅谷极其成功、受人尊敬的计算机工程师、企业家与桑德拉•布拉克斯莉,《纽约日报》的栏目作家共同撰写。本书对人类大脑皮层所具有的知觉、认识、行为和智能功能新理论提出了新的理论构想。这一理论的独到之处在于对大脑皮层的现行认识提出了新的观点,对大脑的工作原理,即霍金斯称之为“真正智能”而非计算机......一起来看看 《人工智能的未来》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具