const (
// Size 库存
Size = 10
// openTime 抢购时长
openTime = 5 * time.Second
)
func main() {
// 商品
commodity := make(chan string, Size)
// 上下文管理器
ctx, cancelFunc := context.WithCancel(context.Background())
for i := 1; i <= Size*10000; i++ {
// 模拟用户抢购
go func(name string, ch chan<- string, cancelFunc context.CancelFunc) {
// 抢购倒计时
for i := 1; i <= 5; i++ {
time.Sleep(1 * time.Second)
}
// 假设:5秒内没抢购到,则已抢购结束
timer := time.NewTimer(openTime)
select {
case ch <- name: // 如果ch已满,则无法写入
log.Println(name, "抢购成功")
case <-timer.C:
log.Println(name, "抢购失败")
cancelFunc() // 结束抢购避免超卖
}
defer func() {
if r := recover(); r != nil {
// 对异常默认不处理
log.Println(r)
}
}()
}(fmt.Sprintf("user-%d", i), commodity, cancelFunc)
}
// 收到抢购结束标志
<-ctx.Done()
// 等待用结束抢购
time.Sleep(openTime)
// 关闭抢购
close(commodity)
log.Println("抢购成功的用户如下:")
for user := range commodity {
log.Println(user)
}
}
Golang模拟电商并发场景-抢购商品
最新推荐文章于 2024-12-10 21:12:04 发布