1. 并行和并发
- 并行:在同一时刻,有多条指令在多个CPU处理器上同时执行
- 2个队伍,2个窗口,要求硬件支持
- 并发:在同一时刻,只能有一条指令执行,但多个进程指令被快速地轮换执行
- 2个队伍,1个窗口,要求提升软件能力
2. go语言并发优势
3. goroutine是什么
- 它是go并发设计的核心
- goroutine就是协程,它比线程更小,十几个goroutine在底层可能就是五六个线程
- go语言内部实现了goroutine的内存共享,执行goroutine只需极少的栈内存(大概是4~5KB)
4. 创建goroutine
- 只需要在语句前添加go关键字,就可以创建并发执行单元
package main
import (
"fmt"
"time"
)
//测试协程
//循环打印内容
func newTask() {
i := 0
for {
i++
fmt.Printf("new goroutine:i=%d\n", i)
time.Sleep(1 * time.Second)
}
}
//main()相当于是主协程
func main() {
//启动子协程
go newTask()
i := 0
for {
i++
fmt.Printf("main goroutine:i=%d\n", i)
time.Sleep(1 * time.Second)
}
}
- 开发⼈员无需了解任何执⾏细节,调度器会自动将其安排到合适的系统线程上执行
- 如果主协程退出了,其他任务还执行吗?不执行
package main
import (
"fmt"
"time"
)
//main()相当于是主协程
func main() {
//匿名子协程
go func() {
i := 0
for {
i++
fmt.Println("子协程 i=", i)
time.Sleep(1 * time.Second)
}
}()
i := 0
for {
i++
fmt.Println("主协程 i=", i)
time.Sleep(1 * time.Second)
//主协程第二次后退出
if i == 2 {
break
}
}
}
package main
import (
"fmt"
"time"
)
//main()相当于是主协程
func main() {
//匿名子协程
go func() {
i := 0
for {
i++
fmt.Println("子协程 i=", i)
time.Sleep(1 * time.Second)
}
}()
}