目的
程序完成有步骤依赖,时序关系,存储关系的需要阻塞-同步等待
方法
1 正常同步
package main
import (
"fmt"
"time"
)
func routineWork(chFlag
chan bool) {
fmt
.Println("Start working...")
time
.Sleep(time
.Second
* 3)
fmt
.Println("work done!")
chFlag
<- true
}
func main
() {
chanFlag
:= make(chan bool, 1)
go routineWork(chanFlag
)
fmt
.Println("finished: ",<- chanFlag
)
fmt
.Println("如果没有打印工作日志,那么routine没有启动完,主程序就结束了。")
}
1 结果
Start working… work done! finished: true 如果没有打印工作日志,那么routine没有启动完,主程序就结束了。
正常同步上了,并且正常结束;
2 阻塞操作<-chan注销
package main
import (
"fmt"
"time"
)
func routineWork(chFlag
chan bool) {
fmt
.Println("Start working...")
time
.Sleep(time
.Second
* 3)
fmt
.Println("work done!")
chFlag
<- true
}
func main
() {
chanFlag
:= make(chan bool, 1)
go routineWork(chanFlag
)
fmt
.Println("如果没有打印工作日志,那么routine没有运行完,主程序就结束了。")
}
2 结果
子协程没运行完,主程序就结束了。
3 没有同步,但是主程序设置足够时间
package main
import (
"fmt"
"time"
)
func routineWork(chFlag
chan bool) {
fmt
.Println("Start working...")
time
.Sleep(time
.Second
* 3)
fmt
.Println("work done!")
chFlag
<- true
}
func main
() {
chanFlag
:= make(chan bool, 1)
go routineWork(chanFlag
)
fmt
.Println("如果没有打印工作日志,那么routine没有运行完,主程序就结束了。")
const n
= 1
time
.Sleep(time
.Second
* n
)
}
3 结果
const n = 1 Start working… 如果没有打印工作日志,那么routine没有运行完,主程序就结束了。
const n = 3 如果没有打印工作日志,那么routine没有运行完,主程序就结束了。 Start working… work done!
延迟3s以上,子协程便能运行完毕了;
同时注意到,协程的第一个打印和主程序的print有先有后,并发运行,哪一个先运行完不定的。—实际是背后的CPU调度进程的不确定性。