Go之并发处理(售票问题)
老问题:模拟一个售票窗口进行售票
先定义类型Ticket(车票)和Conductor(销售员)--偷懒了,把售票和产票都交给Conductor了
package util import () //-------------------------------- type Ticket struct { ID int Price string Type string } //-------------------------------- type Conductor struct { Tickets []Ticket Count int } func NewConductor() *Conductor { return &Conductor{make([]Ticket, 0), 0} } func (this *Conductor) Sell() Ticket { temp := this.Tickets[0] this.Tickets = this.Tickets[1:] return temp } func (this *Conductor) Product() Ticket { ticket := Ticket{this.Count + 1, "$18", "成人票"} this.Count = this.Count + 1 this.Tickets = append(this.Tickets, ticket) return ticket }
func main() { conductor := util.NewConductor() ticketCount := 100 temp := make(chan int, 100) wg := new(sync.WaitGroup) wg.Add(ticketCount * 2) //一个线程产票,一个线程售票 for i := 0; i < ticketCount; i++ { go func() { defer wg.Done() <-temp fmt.Println("出售:", conductor.Sell()) }() } for i := 0; i < ticketCount; i++ { go func() { defer wg.Done() temp <- i fmt.Println("生产:", conductor.Product()) }() } wg.Wait() }
输出结果
出售: {1 $18 成人票} 生产: {2 $18 成人票} 出售: {2 $18 成人票} 生产: {3 $18 成人票} 出售: {3 $18 成人票} 生产: {4 $18 成人票} 出售: {4 $18 成人票} 生产: {5 $18 成人票} 出售: {5 $18 成人票} 生产: {6 $18 成人票} 出售: {6 $18 成人票} 生产: {7 $18 成人票} 出售: {7 $18 成人票} 生产: {8 $18 成人票} 出售: {8 $18 成人票} 生产: {9 $18 成人票} 出售: {9 $18 成人票} 生产: {10 $18 成人票} 出售: {10 $18 成人票} 生产: {11 $18 成人票} 出售: {11 $18 成人票} 生产: {12 $18 成人票} 出售: {12 $18 成人票} 生产: {13 $18 成人票} 出售: {13 $18 成人票} 生产: {14 $18 成人票} 出售: {14 $18 成人票} 生产: {15 $18 成人票} 出售: {15 $18 成人票} 生产: {16 $18 成人票} 出售: {16 $18 成人票} 生产: {17 $18 成人票} 出售: {17 $18 成人票} 生产: {18 $18 成人票} 出售: {18 $18 成人票} 生产: {19 $18 成人票} 出售: {19 $18 成人票} 生产: {20 $18 成人票} 出售: {20 $18 成人票} 生产: {21 $18 成人票} 出售: {21 $18 成人票} 生产: {22 $18 成人票} 出售: {22 $18 成人票} 生产: {23 $18 成人票} 出售: {23 $18 成人票} 生产: {24 $18 成人票} 出售: {24 $18 成人票} 生产: {25 $18 成人票} 出售: {25 $18 成人票} 生产: {26 $18 成人票} 生产: {1 $18 成人票} 出售: {26 $18 成人票} 生产: {27 $18 成人票} 生产: {28 $18 成人票} 出售: {27 $18 成人票} 生产: {29 $18 成人票} 生产: {30 $18 成人票} 出售: {28 $18 成人票} 生产: {31 $18 成人票} 生产: {32 $18 成人票} 出售: {29 $18 成人票} 生产: {33 $18 成人票} 生产: {34 $18 成人票} 出售: {30 $18 成人票} 生产: {35 $18 成人票} 出售: {31 $18 成人票} 生产: {36 $18 成人票} 生产: {37 $18 成人票} 出售: {32 $18 成人票} 生产: {38 $18 成人票} 生产: {39 $18 成人票} 出售: {33 $18 成人票} 出售: {34 $18 成人票} 生产: {40 $18 成人票} 生产: {41 $18 成人票} 出售: {35 $18 成人票} 出售: {36 $18 成人票} 生产: {42 $18 成人票} 生产: {43 $18 成人票} 出售: {37 $18 成人票} 出售: {38 $18 成人票} 生产: {44 $18 成人票} 生产: {45 $18 成人票} 出售: {39 $18 成人票} 出售: {40 $18 成人票} 生产: {46 $18 成人票} 生产: {47 $18 成人票} 出售: {41 $18 成人票} 出售: {42 $18 成人票} 生产: {48 $18 成人票} 生产: {49 $18 成人票} 出售: {43 $18 成人票} 出售: {44 $18 成人票} 生产: {50 $18 成人票} 生产: {51 $18 成人票} 出售: {45 $18 成人票} 出售: {46 $18 成人票} 生产: {52 $18 成人票} 生产: {53 $18 成人票} 出售: {47 $18 成人票} 出售: {48 $18 成人票} 生产: {54 $18 成人票} 生产: {55 $18 成人票} 出售: {49 $18 成人票} 出售: {50 $18 成人票} 生产: {56 $18 成人票} 生产: {57 $18 成人票} 出售: {51 $18 成人票} 出售: {52 $18 成人票} 生产: {58 $18 成人票} 生产: {59 $18 成人票} 出售: {53 $18 成人票} 出售: {54 $18 成人票} 生产: {60 $18 成人票} 生产: {61 $18 成人票} 出售: {55 $18 成人票} 出售: {56 $18 成人票} 生产: {62 $18 成人票} 生产: {63 $18 成人票} 出售: {57 $18 成人票} 出售: {58 $18 成人票} 生产: {64 $18 成人票} 生产: {65 $18 成人票} 出售: {59 $18 成人票} 出售: {60 $18 成人票} 生产: {66 $18 成人票} 生产: {67 $18 成人票} 出售: {61 $18 成人票} 出售: {62 $18 成人票} 生产: {68 $18 成人票} 生产: {69 $18 成人票} 出售: {63 $18 成人票} 出售: {64 $18 成人票} 生产: {70 $18 成人票} 生产: {71 $18 成人票} 出售: {65 $18 成人票} 出售: {66 $18 成人票} 生产: {72 $18 成人票} 生产: {73 $18 成人票} 出售: {67 $18 成人票} 出售: {68 $18 成人票} 生产: {74 $18 成人票} 出售: {69 $18 成人票} 出售: {70 $18 成人票} 生产: {75 $18 成人票} 生产: {76 $18 成人票} 出售: {71 $18 成人票} 出售: {72 $18 成人票} 生产: {77 $18 成人票} 生产: {78 $18 成人票} 出售: {73 $18 成人票} 出售: {74 $18 成人票} 生产: {79 $18 成人票} 生产: {80 $18 成人票} 出售: {75 $18 成人票} 出售: {76 $18 成人票} 生产: {81 $18 成人票} 生产: {82 $18 成人票} 出售: {77 $18 成人票} 出售: {78 $18 成人票} 生产: {83 $18 成人票} 生产: {84 $18 成人票} 出售: {79 $18 成人票} 出售: {80 $18 成人票} 生产: {85 $18 成人票} 生产: {86 $18 成人票} 出售: {81 $18 成人票} 出售: {82 $18 成人票} 生产: {87 $18 成人票} 生产: {88 $18 成人票} 出售: {83 $18 成人票} 出售: {84 $18 成人票} 生产: {89 $18 成人票} 生产: {90 $18 成人票} 出售: {85 $18 成人票} 出售: {86 $18 成人票} 生产: {91 $18 成人票} 生产: {92 $18 成人票} 出售: {87 $18 成人票} 出售: {88 $18 成人票} 生产: {93 $18 成人票} 生产: {94 $18 成人票} 出售: {89 $18 成人票} 出售: {90 $18 成人票} 生产: {95 $18 成人票} 生产: {96 $18 成人票} 出售: {91 $18 成人票} 出售: {92 $18 成人票} 生产: {97 $18 成人票} 出售: {93 $18 成人票} 出售: {94 $18 成人票} 出售: {95 $18 成人票} 生产: {98 $18 成人票} 出售: {96 $18 成人票} 生产: {99 $18 成人票} 出售: {97 $18 成人票} 生产: {100 $18 成人票} 出售: {98 $18 成人票} 出售: {99 $18 成人票} 出售: {100 $18 成人票}