golang佇列任務處理
阿新 • • 發佈:2020-09-12
package main import ( "crypto/rand" "fmt" "math/big" "strconv" "strings" "time" ) type task struct { id uint32 // 訂單編號 callback chan int // 工廠編號 } const taskNum = 16 // 準備找16個工廠 var chTaskList = make([]chan task, taskNum) // 工廠列表 var arr = [10]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} func task_init() { for i := 0; i < taskNum; i++ { chTaskList[i] = make(chan task) // 工廠登記 go working(chTaskList[i], i) // 工廠開門大吉,待命中 } } func main() { task_init() // 工廠就緒 time.Sleep(1 * time.Second) for i := 0; i < 100; i++ { go order() // 給工廠派活 } time.Sleep(5 * time.Second) } // 出任務的,甲方爸爸 func order() { id := randomString(10) // 來個訂單號 callack := make(chan int) // 把返程的招呼打好 t := task{id: uint32(id), callback: callack} // 訂單起草完畢 chTasks := chTaskList[id%taskNum] // 隨機選擇一個工廠,因為id都是隨機生成的,取餘數也是一個隨機值 chTasks <- t // 把訂單交給小弟讓他送工廠去 msg := <-callack fmt.Printf("給%v號工廠下了訂單,%v號工廠拿到了訂單\n", id%taskNum, msg) } // 工廠,接收小弟(chan),返回工廠編號 func working(chTasks chan task, num int) { fmt.Printf("第%v號工廠待命中...\n", num) for { t := <-chTasks // 卸貨 id := t.id // 訂單編號 _ = id // 此處生產產品(業務邏輯) t.callback <- num // 返回工廠編號 } } // 生成訂單號 func randomString(n int) uint32 { var b []string for i := 0; i < n; i++ { num, _ := rand.Int(rand.Reader, big.NewInt(int64(len(arr)))) // 1.將 *big.Int 轉化為 int64 // 2.將 int 64 轉化為 int // 3.將 int 轉化為 string b = append(b, strconv.Itoa(arr[int(num.Int64())])) } str := strings.Join(b, "") // 拼接字串 a, _ := strconv.Atoi(str) // string 轉 int yes := uint32(a) // int 轉 uint32 return yes }