Golang之路---04 并发编程——协程:goroutine

协程:goroutine

Golang 作为一门现代化的编程语言,它不需要你直面这些复杂的问题。在 Golang 里,你不需要学习如何创建进程池/线程池,也不需要知道什么情况下使用多线程,什么时候使用多进程。因为你没得选,也不需要选,它原生提供的 goroutine (也即协程)已经足够优秀,能够自动帮你处理好所有的事情,而你要做的只是执行它,就这么简单。

一个 goroutine 本身就是一个函数,当你直接调用时,它就是一个普通函数,如果你在调用前加一个关键字 go ,那你就开启了一个 goroutine。

// 执行一个函数
func()

// 开启一个协程执行这个函数
go func()

协程的初步使用

一个 Go 程序的入口通常是 main 函数,程序启动后,main 函数最先运行。

在 main 中或者其下调用的代码中才可以使用 go + func() 的方法来启动协程。

main 的地位相当于主线程,当 main 函数执行完成后,这个线程也就终结了,其下的运行着的所有协程也不管代码是不是还在跑,也得乖乖退出。

因此如下这段代码运行完,只会输出 hello, world ,而不会输出hello, go(因为协程的创建需要时间,当 hello, world打印后,协程还没来得及并执行)

import "fmt"

func mytest() {
    fmt.Println("hello, go")
}

func main() {
    // 启动一个协程
    go mytest()
    fmt.Println("hello, world")
}

对于刚学习Go的协程同学来说,可以使用 time.Sleep 来使 main 阻塞,使其他协程能够有机会运行完全,但你要注意的是,这并不是推荐的方式(后续我们会学习其他更优雅的方式)。

当我在代码中加入一行 time.Sleep 输出就符合预期了。

import (
	"fmt"
    "time"
)

func mytest(){
    fmt.Println("hello,go")
}

func main(){
    go mytest()
    /* hello,world
       hello,go */
    fmt.Println("hello,world")
    time.Sleep(time.Second)
}

多个协程的使用

func mygo(name string){
    for  i:= 0; i < 5 ;i++{
        fmt.Printf("In goroutine %s\n",name)
        time.Sleep(10 * time.Millisecond)
    }
}

func main(){
 go mygo("协程1号")
 go mygo("协程2号")
 time.Sleep(time.Second)
}

输出如下,可以观察到两个协程就如两个线程一样,并发执行
在这里插入图片描述
将同步代码转为异步代码,真的只要一个关键字就可以了,也不需要使用其他库,简单方便。

本篇只介绍了协程的简单使用,真正的并发程序还是要结合信道 (channel)来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值