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

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

内容简介:一般直接在要执行的函数前,加上 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的使用还有很多坑,也需要注意,以后遇到记录


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

查看所有标签

猜你喜欢:

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

XML Hacks

XML Hacks

Michael Fitzgerald / O'Reilly Media, Inc. / 2004-07-27 / USD 24.95

Developers and system administrators alike are uncovering the true power of XML, the Extensible Markup Language that enables data to be sent over the Internet from one computer platform to another or ......一起来看看 《XML Hacks》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具