go学习 七 并发携程管道
并发

创建并发
新建一个携程

运行结果

当主携程退出后,子携程也就退出了

例子;当主携程没有其他内容时,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 main
import (
"fmt"
"runtime"
)
func main() {
runtime.GOMAXPROCS(1)
int_chan := make(chan int, 1)
string_chan := make(chan string, 1)
int_chan <- 1
string_chan <- "hello"
select {
case value := <-int_chan:
fmt.Println(value)
case value := <-string_chan:
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 := <-ch: fmt.Println("num=", num) case <-time.After(2 * time.Second): fmt.Println("超时了") qui <- true } } }() for i := 0; i < 5; i++ { ch <- i } <-qui fmt.Println("结束") }
运行结果
num= 0 num= 1 num= 2 num= 3 num= 4 超时了 结束




浙公网安备 33010602011771号