天天看點

利用Go高并發秒級處理10萬資料

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("==主線程退出==")