• 技术文章 >后端开发 >Golang

    golang异步是什么

    青灯夜游青灯夜游2022-12-28 10:54:45原创723

    在golang中,异步是指不按照代码顺序执行,一个异步过程的执行将不再与原有的序列有顺序关系;在异步中,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。golang异步主要是由协程(goroutine)实现的;goroutine用来调用函数,当某个函数被go关键字调用后,go就会创建一个类似协程的东西,来执行这个函数,这样可以轻易的实现并发。

    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

    异步是什么?

    异步(Asynchronous, async)是与同步(Synchronous, sync)相对的概念。在我们学习的传统单线程编程中,程序的运行是同步的(同步不意味着所有步骤同时运行,而是指步骤在一个控制流序列中按顺序执行)。而异步的概念则是不保证同步的概念,也就是说,一个异步过程的执行将不再与原有的序列有顺序关系。

    简单来理解就是:同步按你的代码顺序执行,异步不按照代码顺序执行,异步的执行效率更高。

    另一种解释就是:

    给你两个容器,一个叫同步,一个叫异步,把要执行的代码分别分到同步和异步里面,先执行同步同时异步待编译,等同步执行完后执行异步里面的代码。

    golang怎么实现异步

    Go的异步主要是由协程(goroutine)实现的。协程相对于线程来说,占用的内存更少,更轻量级,这也是Go在性能上的优势。

    Go 语言是一种并发编程语言,在 Go 里有一个非常重要的关键字 go(goroutine),一般我们可以用它做一些异步,并发的任务。
    goroutine 用来调用函数,当某个函数被 go 关键字调用后,go 就会创建一个类似协程的东西,来执行这个函数,这样可以轻易的实现并发。

    示例:

    package main
    import (
    	"fmt"
    )
    func main() {
    	go work1()
    	go work2()
    	fmt.Println("[全部完成]")
    }
    func work1(){
    	fmt.Println("work1")
    }
    func work2(){
    	fmt.Println("work2")
    }

    结果:

    [全部完成]

    当然这是一个不恰当的示例,但这也证明了异步执行,在调用work1,work2之后不等输出结果,就继续执行了。
    要想等异步执行完之后,再执行最后的输出,需要加入WaitGroup

    正确示例:

    package main
    
    import (
    	"fmt"
    	"sync"
    )
    
    var waitGroup sync.WaitGroup
    func main() {
    	waitGroup.Add(2)
    	go work1()
    	go work2()
    	waitGroup.Wait()
    	fmt.Println("[全部完成]")
    }
    func work1(){
    	fmt.Println("work1")
    	waitGroup.Done()
    }
    func work2(){
    	fmt.Println("work2")
    	waitGroup.Done()
    }

    结果:

    work2
    work1
    [全部完成]

    【相关推荐:Go视频教程编程教学

    以上就是golang异步是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:异步 go语言 Golang
    上一篇:go语言怎么将整型转为字符串 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • go语言同步机制有哪些• golang map怎么修改• golang架构包括哪些• go语言兼容c语言吗• go语言中str是什么意思• 区块链只能用go语言吗
    1/1

    PHP中文网