-
fork and join
查看全部 -
package?main import?( ???"fmt" ???"sync" ???"time" ) var?global?=?sync.WaitGroup{} //?A車傳送給B車的通道 var?ch1?=?make(chan?*material,?3) //?B車傳送給C車的通道 var?ch2?=?make(chan?*material,?3) //?食材 type?material?struct?{ ???//?食材名稱 ???name?string ???//?食材數量 ???count?byte ???//?A車處理所需花費時間,單位秒 ???elapsedTimeA?uint ???//?B車處理所需花費時間,單位秒 ???elapsedTimeB?uint ???//?C車處理所需花費時間,單位秒 ???elapsedTimeC?uint } func?main()?{ ???global.Add(3) ???//?所有需要處理的食材 ???materials?:=?[]*material{ ??????{"白菜",?12,?2,?1,?1}, ??????{"青菜",?12,?1,?1,?1}, ??????{"胡蘿卜",?12,?1,?1,?1}, ???} ???start?:=?time.Now() ???go?A(materials) ???go?B() ???go?C() ???global.Wait() ???cost?:=?time.Since(start) ???fmt.Printf("總耗時:%s\n",?cost) } func?A(materials?[]*material)?{ ???fmt.Printf("A車出發(fā)\n") ???//?循環(huán)處理每種食材 ???for?_,?ele?:=?range?materials?{ ??????var?worker?=?sync.WaitGroup{} ??????worker.Add(3) ??????//?3名工人分別處理每種食材的1/3 ??????for?i?:=?0;?i?<?3;?i++?{ ?????????go?func(index?int,?ele2?*material)?{ ????????????fmt.Printf("A車工人[%d]正在清洗食材[%s],數量[%d],預計耗時[%d]秒\n",?index,?ele2.name,?ele2.count/3,?ele2.elapsedTimeA) ????????????//?睡眠模擬處理食材耗時 ????????????time.Sleep(time.Second?*?time.Duration(ele2.elapsedTimeA)) ????????????worker.Done() ?????????}(i,?ele) ??????} ??????//?等待所有工人都處理完畢后,把處理后的食材傳送給B車 ??????worker.Wait() ??????fmt.Printf("A車食材[%s]正在運往B車\n",?ele.name) ??????ch1?<-?ele ???} ???fmt.Printf("A車任務結束\n") ???global.Done() } func?B()?{ ???fmt.Printf("B車出發(fā)\n") ???//?循環(huán)處理3種食材 ???for?i?:=?0;?i?<?3;?i++?{ ??????//?從通道取不到數據時會阻塞,只有通道關閉時ok才等于false,所以下面的if判斷可以忽略 ??????ele,?ok?:=?<-ch1 ??????if?!ok?{ ?????????break ??????} ??????fmt.Printf("B車接收到A車食材[%s]\n",?ele.name) ??????var?worker?=?sync.WaitGroup{} ??????worker.Add(3) ??????for?j?:=?0;?j?<?3;?j++?{ ?????????go?func(index?int,?ele2?*material)?{ ????????????fmt.Printf("B車工人[%d]正在加工食材[%s],數量[%d],預計耗時[%d]秒\n",?index,?ele2.name,?ele2.count/3,?ele2.elapsedTimeB) ????????????//?睡眠模擬處理食材耗時 ????????????time.Sleep(time.Second?*?time.Duration(ele2.elapsedTimeB)) ????????????worker.Done() ?????????}(j,?ele) ??????} ??????//?等待所有工人都處理完畢后,把處理后的食材傳送給C車 ??????worker.Wait() ??????fmt.Printf("B車食材[%s]正在運往C車\n",?ele.name) ??????ch2?<-?ele ???} ???fmt.Printf("B車任務結束\n") ???global.Done() } func?C()?{ ???fmt.Printf("C車出發(fā)\n") ???for?i?:=?0;?i?<?3;?i++?{ ??????//?從通道取不到數據時會阻塞,只有通道關閉時ok才等于false,所以下面的if判斷可以忽略 ??????ele,?ok?:=?<-ch2 ??????if?!ok?{ ?????????break ??????} ??????fmt.Printf("C車接收到B車食材[%s]\n",?ele.name) ??????var?worker?=?sync.WaitGroup{} ??????worker.Add(3) ??????for?j?:=?0;?j?<?3;?j++?{ ?????????go?func(index?int,?ele2?*material)?{ ????????????fmt.Printf("C車工人[%d]正在裝載食材[%s],數量[%d],預計耗時[%d]秒\n",?index,?ele2.name,?ele2.count/3,?ele2.elapsedTimeC) ????????????//?睡眠模擬處理食材耗時 ????????????time.Sleep(time.Second?*?time.Duration(ele2.elapsedTimeC)) ????????????worker.Done() ?????????}(j,?ele) ??????} ??????worker.Wait() ???} ???fmt.Printf("C車任務結束\n") ???global.Done() }
查看全部 -
終端,pid,IDE查看全部
-
context實現goroutine中斷查看全部
-
可能習慣了直接聽干貨知識,講做菜雖然很生動,但是聽起來總感覺別扭。查看全部
-
總結總結總結
查看全部 -
面試題之白板寫代碼
查看全部 -
面試題之解題邏梳理
查看全部 -
面試題之梳理
查看全部 -
面試題之考點
查看全部 -
實操案例:生產者和消費者
查看全部 -
如何利用 channel 阻塞
查看全部 -
企業(yè)級解決辦法
查看全部 -
Channel 阻塞的重后果
查看全部 -
Channe 阻塞條件
查看全部
舉報
0/150
提交
取消