package main
//需求: 利用Go高并發秒級處理10萬資料
import(
"fmt"
_"time"
)
//生産消息
func putNum(intChan chan int, nums int) {
for i:=0; i< nums; i++{
intChan<- i
//fmt.Printf("==putNum:%d==\n", i)
}
close(intChan)
//消費消息
func primeNum(intChan chan int, primeChan chan int, exitChan chan bool, chanNum int) {
var flg bool
for{
//time.Sleep(time.Second)
//取資料
num, ok := <- intChan
//判斷管道是否無資料可取
if !ok{
break
//判斷是否素數(除了1和本身可以整除的數),預設辨別非素數
flg = false
for i:=2; i<num; i++{
if num % i != 0{
flg = true
//将素數放進管道2
if flg{
primeChan<- num
fmt.Printf("==協程%d完成作業,退出==\n", chanNum)
//向退出管道告知,我這個協程完成作業了,寫入一個T
exitChan<- true
func main() {
//建立管道1:存資料
intChan := make(chan int, 200000)
//建立管道2:存處理後的資料
primeChan := make(chan int, 2000)
//建立管道3:存管道處理完成的辨別
exitChan := make(chan bool, 4)
//開啟一個協程 向管道1寫資料
go putNum(intChan, 100000)
//time.Sleep(10 * time.Second)
//開啟4個協程從管道1取資料并且判斷是否素數,将素數存入管道2中,另外取不到資料時将T寫進管道3
for i:=1; i<=4; i++{
go primeNum(intChan, primeChan, exitChan, i)
//處理主線程阻塞
go func () {
//隻要能取出4個數就認為管道都完成作業,此時主線程可以退出
<-exitChan
close(primeChan)
}()
//周遊出管道2中的素數
for {
_,ok := <-primeChan
//fmt.Printf("==素數:%d==\n", res)
fmt.Println("==主線程退出==")