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 成人票}

  

原文地址:https://www.cnblogs.com/anbylau2130/p/4867707.html