11.使用Goroutine

阻塞和非阻塞代码

模拟阻塞的函数调用

package main

import (
    "fmt"
    "time"
)

func slowFunc(){
    fmt.Println("begin")
    time.Sleep(time.Second * 2)
    fmt.Println("sleeper() finished")
}

func main(){
    slowFunc()
    fmt.Println("succeed")

}

// begin
// sleeper() finished
// succeed
  • 方法time.Slee让程序暂停2s
  • 2s后,函数slowFunc打印一行文本再返回
  • 控制权返回到main函数,因此执行第二行代码

使用Goroutine处理并发操作

Go语言提供了Goroutine,能够处理并发操作,通过使用Goroutine,可在调用函数slowFunc后立即执行main函数中的第二行代码。在这种情况下函数slowFunc依然会执行,但不会阻塞程序中其他代码行的执行

package main

import (
    "fmt"
    "time"
)

func slowFunc(){
    fmt.Println("begin")
    time.Sleep(time.Second * 2)
    fmt.Println("sleeper() finished")
}

func main(){
    go slowFunc()
    fmt.Println("succeed")

}

运行之后,发现没有看到slowFunc中的结果,原因是Goroutine立即返回,意味着程序将接着执行后面的代码,然后退出。如果没有其他因素,程序将在Goroutine返回前就退出

package main

import (
    "fmt"
    "time"
)

func slowFunc(){
    fmt.Println("begin")
    time.Sleep(time.Second * 2)
    fmt.Println("sleeper() finished")
}

func main(){
    go slowFunc()
    fmt.Println("succeed")

    //阻止程序退出
    time.Sleep(time.Second * 3)

}

// succeed
// begin
// sleeper() finished

定义Goroutine

Go在幕后使用线程来管理并发,但Goroutine让程序员无须直接管理线程

Goroutine是一个并发抽象,因此开发人员通常无须准确地知道操作系统中发生的情况

© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片