阻塞和非阻塞代码
模拟阻塞的函数调用
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
暂无评论内容