下载地址:​百度网盘

——/spark3.0从零到精通/
├──资料-spark
| └──spark3.0.zip 1.22G
├──Spark-day01.rar 562.65M
├──Spark-day02.rar 434.62M
├──Spark-day03.rar 625.37M
├──Spark-day04.rar 473.02M
├──Spark-day05.rar 466.49M
├──Spark-day06.rar 598.49M
├──Spark-day07.rar 528.41M
└──Spark-day08.rar 526.76M

 

for select 无限循环模式

这个模式比较常见,之前文章中的示例也使用过,它一般是和 channel 组合完成任务,格式为:

for { //for 无限循环,或者使用 for range 循环
select {
//通过 channel 控制
case <-done:
return
default:
//执行具体的任务
}
}
  • 这种是 for + select 多路复用的并发模式,哪个 case 满足条件就执行对应的分支,直到有满足退出的条件,才会退出循环。
  • 没有退出条件满足时,则会一直执行 default 分支

for range select 有限循环模式

for _,s:=range []int{}{
select {
case <-done:
return
case resultCh <- s:
}
  • 一般把迭代的内容发送到 channel 上
  • done channel 用于退出 for 循环
  • resultCh channel 用来接收循环的值,这些值可以通过 resultCh 传递给其他调用者

select timeout 模式

假如一个请求需要访问服务器获取数据,但是可能因为网络问题而迟迟获取不到响应,这时候就需要设置一个超时时间:

package main

import (
"fmt"
"time"
)

func main() {
result := make(chan string)
timeout := time.After(3 * time.Second) //
go func() {
//模拟网络访问
time.Sleep(5 * time.Second)
result <- "服务端结果"
}()
for {
select {
case v := <-result:
fmt.Println(v)
case <-timeout:
fmt.Println("网络访问超时了")
return
default:
fmt.Println("等待...")
time.Sleep(1 * time.Second)
}
}
}