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
超时了
结束

 

 

posted on 2019-05-27 18:35  王大拿  阅读(983)  评论(0)    收藏  举报

导航