并发
创建并发
新建一个携程
运行结果
当主携程退出后,子携程也就退出了
例子;当主携程没有其他内容时,main 的主携程退出后,子携程直接退出了
现象
现象
Gosched()
加上 runtime.Gosched()之后
现象 可见可以先执行其他线程 再其他线程执行完成之后再执行主线程
return终止函数的效果
效果
Goexit()终止所在携程的作用
(所在的携程整个都终止)
效果
runtime.GOMAXPROCS(n) 指定以多少核运算
多任务资源竞争问题
例子
效果
打印结果分析
chanel
channel的使用
通过channel实现数据同步和数据交互
使用无缓的冲通道在 goroutine之间同步
实例
有缓存channel
运行效果
有缓冲channel超出容量后会阻塞
代码
运行效果
关闭channel
代码
运行结果
通过range遍历channel中的内容
结果
单方向的channel
创建方式和特点
单向channel的应用
生产者消费者模型
定时器
实例代码 timer
通过timer实现延时功能 和其他延时功能实现方式
停止和重制定时器
reset重新设定时间
运行结果
ticker的使用
运行结果
select
select的随机性
下面代码会触发异常吗?请详细说明
package mainimport("fmt"
"runtime")
func main() {
runtime.GOMAXPROCS(1)
int_chan := make(chan int, 1)
string_chan := make(chan string, 1)
int_chan
case value :=
fmt.Println(value)
case value :=
panic(value)
}
}
考点:select随机性
解答:
select会随机选择一个可用通用做收发操作。 所以代码是有可能触发异常,也有可能不会。 单个chan如果无缓冲时,将会阻塞。但结合 select可以在多个chan间等待执行。有三点原则:
select 中只要有一个case能return,则立刻执行。
当如果同一时间有多个case均能return则伪随机方式抽取任意一个执行。
如果没有一个case能return则可以执行”default”块。
使用select 实现斐波那契数列
运行结果
select实现超时机制
代码
func main() {
ch :=make(chan int)
qui :=make(chan bool)
go func() {for{
select {
case num :=
fmt.Println("num=", num)
case
fmt.Println("超时了")
qui
}
}
}()for i := 0; i < 5; i++{
ch
}
fmt.Println("结束")
}
运行结果
num=0
num= 1num= 2num= 3num= 4超时了
结束