第14章 并发、并行、协程
2020-01-25 本文已影响0人
yezide
1、协程
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("主函数开始")
go longWait()
go shortWait()
time.Sleep(4 * 1e9)
fmt.Println("主函数结束")
}
func longWait() {
fmt.Println("开始longWait.")
time.Sleep(5 * 1e9)
// 以下代码不会被执行,原因是主函数只等了4s,main退出后协程被销毁
fmt.Println("结束longWait.")
}
func shortWait() {
fmt.Println("开始shortWait.")
time.Sleep(2 * 1e9)
fmt.Println("结束shortWait.")
}
2、 信道
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan string)
go sendData(ch)
go getData(ch)
time.Sleep(10 * 1e9)
}
func sendData(ch chan string) {
ch <- "welcome "
ch <- "to "
ch <- "the "
ch <- "junnel"
}
func getData(ch chan string) {
for {
input := <- ch
fmt.Printf("%s ", input)
}
}
3、 一个好玩的计算素数的例子
package main
import "fmt"
// 构建队列,放入2-100的整数
func genData(ch chan int) {
for i :=2; i <= 100; i++ {
ch <- i
}
defer close(ch)
}
// 素数计算过程. 思路是原始数据 % 第1个,如果不符合去掉
// 主要靠主函数那里
func filterData(originCh chan int, newCh chan int, firstNum int) {
for {
num := <- originCh
if num % firstNum != 0 {
newCh <- num
}
}
}
func main() {
// 初始化数据
originCh := make(chan int)
go genData(originCh)
for {
firstNum := <- originCh
fmt.Print(firstNum, " ")
newCh := make(chan int)
go filterData(originCh, newCh, firstNum)
originCh = newCh
}
}