Go语言学习笔记(十一)
这部分开始就有点东西了
一、使用Goroutine
1 并发和并行
并发和并行的区别:
我自己的理解是
并行:真正的多个进程同时运行,主要是用于多核CPU的概念
并发:指的是多个进程在同一个CPU上运行只不过因为切换的贼快,我们以为这多个进程是同时进行的。
2 阻塞和非阻塞代码
模拟函数调用阻塞程序的执行直到操作完成的情形。为模拟缓慢的函数调用,可使用time.Sleep,他的作用是让程序暂停指定的时间。在实际编程中,这可能是缓慢的函数调用或需要运行很长时间的函数
package main
import (
"fmt"
"time"
)
func slowFunc() {
fmt.Println("ssd")
time.Sleep(time.Second * 2)
fmt.Println("sleeper() finished")
}
func main() {
slowFunc()
fmt.Println("I'm not shown until slowFunc() completes")
}
/*输出,当输出ssd之后停留两秒钟才会有后面的输出
ssd
sleeper() finished
I'm not shown until slowFunc() completes
*/
3 使用Goroutine处理并发操作
Go语言提供了Goroutine,可以很方便的处理并发操作。通过使用Goroutine,可在调用函数slowFunc后
立即执行main函数中的第二行代码。在这种情况下,函数slowFunc仍然会执行,但不会阻塞程序中其他代码行的执行
Goroutine使用起来非常简单,只需在要让Goroutine执行的函数或方法前加上关键字go
即可,实例如下
package main
import (
"fmt"
"time"
)
func slowFunc() {
fmt.Println("ssd")
time.Sleep(time.Second * 2)
fmt.Println("sleeper() finished")
}
func main() {
go slowFunc()
fmt.Println("I'm not shown until slowFunc() completes")//只输出了这一行I'm not shown until slowFunc() completes,这是因为这行代码之后程序结束
}
修改一下:
package main
import (
"fmt"
"time"
)
func slowFunc() {
fmt.Println("ssd")
time.Sleep(time.Second * 2)
fmt.Println("sleeper() finished")
}
func main() {
go slowFunc()
fmt.Println("I'm not shown until slowFunc() completes")
time.Sleep(time.Second * 4)
}
4 相关问题
Goroutine为何要立即返回?
Goroutine之所以立即返回,是因为这样才符合非阻塞执行的理念
可在哪些情况下使用Goroutine?
在事件发生顺序未知的情况下,使用Goroutine是不错的选择。比如网络调用、读取磁盘文件以及创建事件驱动的程序(如聊天应用和游戏)
参考书籍
[1]: 【Go语言入门经典】[英] 乔治·奥尔波 著 张海燕 译