首页 > 其他分享 >go-使用通道模拟抢到活动

go-使用通道模拟抢到活动

时间:2023-12-28 14:58:46浏览次数:23  
标签:string int sync go 通道 gorm 模拟 userCount

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"math/rand"
	"sync"
	"time"
)

// 用户结构体

type User struct {
	Id      int
	Name    string
	Tel     string
	Address string
}

// 使用通道来模拟商品抢购活动,用户量1000,商品数量是10
var wg sync.WaitGroup

// 全局变量存储数据库连接
var db *gorm.DB

// 连接数据库
func init() {
	dsn := "root:root@tcp(127.0.0.1:8889)/2112a"
	db, _ = gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

func main() {

	userCount := 1000000 //用户人数
	productCount := 10   //商品数量

	users := make(chan User, userCount)     //用户通道
	product := make(chan int, productCount) //商品通道

	// 将商品编号写入通道
	for i := 1; i <= productCount; i++ {
		product <- i
	}

	// 模拟用户信息 存入用户通道
	for i := 1; i <= userCount; i++ {
		user := User{
			Name:    fmt.Sprintf("用户%d", i),
			Tel:     TelNumber(),
			Address: fmt.Sprintf("上海市奉贤区海湾镇XXXX号-%d", i),
		}
		users <- user
	}
	close(users) //关闭通道

	// 模拟抢购
	for user := range users {
		wg.Add(1)
		go func(u User) {
			defer wg.Done()
			select {
			case <-product:
				fmt.Printf("%s请购成功,手机号为%s,收获地址为%s\n", u.Name, u.Tel, u.Address)
				Insert(u)
			default:
				fmt.Printf("%s请购失败\n", u.Name)
			}
		}(user)
	}
	wg.Wait()

	fmt.Println("活动结束")
}

// 随机生成11位手机号

func TelNumber() string {
	rand.Seed(time.Now().UnixNano())                                                         // 设置随机数种子
	prefix := []string{"130", "131", "132", "133", "135", "137", "138", "170", "187", "189"} // 手机号前缀
	mobile := prefix[rand.Intn(len(prefix))]                                                 // 随机生成手机号前缀
	for i := 0; i < 8; i++ {
		number := rand.Intn(10) // 生成0-9之间的随机数字
		mobile += fmt.Sprintf("%d", number)
	}
	return mobile
}

// 添加入库

func Insert(u User) bool {
	err := db.Create(&u).Error
	if err != nil {
		return false
	} else {
		return true
	}
}

  

标签:string,int,sync,go,通道,gorm,模拟,userCount
From: https://www.cnblogs.com/superzwb/p/17932700.html

相关文章

  • 【Django进阶】djangorestframework-jwt使用
    简介Jsonwebtoken(JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资......
  • 排球比赛模拟
    importrandomdefprint_intro():print("排球比赛模拟程序")print("-------------------------------")definput_teams():team1_ability=float(input("请输入第一个球队的能力值:"))team2_ability=float(input("请输入第二个球队的能力值:"))returnteam1......
  • MongoDB Oplogs 到底都记录了什么 与 智者老冯
    最近董宇辉的事情,让我意识到,如果光一味的搞技术,那么对于人生和生活是不完整的,后序在撰写一些技术文章的时候,会带有一些对于当前热点事件的一些感触和反思,也希望能找到一些有同样想法的人,终究人生的道路是孤独的,如果在孤独中能找到一些人能对你有一些共鸣,那是一件幸福的事情。这里先......
  • Golang channel的关闭
    使用内置函数close可以关闭channel,当channel关闭后,就不能再向channel写数据了,但是仍然可以从channel中读取数据。一旦将channel关闭了,只能读不能写。相当于关闭管道就数据不能进入到队列里面了,只能进行读操作,只读不写。channel支持for-range的方式进行遍历,请注意两个细节(1)在遍历时,......
  • 超时控制:Go语言下的网络请求与时间赛跑
    开场白:在互联网的世界里,我们经常要与各种API打交道。有时,这些API可能会因为各种原因而变得“慢条斯理”,这时,超时控制就显得尤为重要了。今天,我们就来聊聊如何在Go语言中实现HTTP请求的超时控制,与时间赛跑!知识点一:了解超时控制的必要性想象一下,当你正在等待一个重要的API响应时,如果......
  • 跨域请求:Go语言下的“通天大道”
    开场白:嘿,各位Go语言的爱好者们,你们是否曾经遇到过这样的困扰:当你的Go应用试图与另一个域的API进行交流时,突然跳出一个“未允许的跨域请求”的警告?别担心,今天,我们将一起在这条“通天大道”上漫步,解决跨域的困扰!知识点一:何为跨域问题?简单来说,当你在浏览器中访问一个网页,该网页试图从......
  • HTTP代理服务器:Go语言下的“网络翻译官”
    开场白:在这个全球化的网络时代,有时我们需要一个“翻译官”来帮助不同系统、不同语言进行交流。今天,我们就来探讨如何使用Go语言,轻松实现这样一个角色——HTTP代理服务器,让我们的网络请求更加畅通无阻!知识点一:什么是HTTP代理服务器?想象一下,你是一名只会说中文的游客,身处一个只会说英......
  • 处理HTTP错误响应:Go语言中的稳健之道
    开场白:在Web开发中,HTTP错误响应是不可避免的一部分。当请求无法成功完成时,服务器会返回一个错误响应。今天,我们将深入探讨如何在Go语言中优雅地处理这些HTTP错误响应。知识点一:HTTP错误响应的常见类型HTTP错误响应通常由状态码和相应的消息组成。常见的状态码包括:404(未找到)、500(内......
  • 更改主板开机logo图标
    测试型号:微星MAGB660MMORTARWIFIDDR4(迫击炮)原理通过ChangeLogo修改BIOS文件内的图标刷入修改后的BIOS文件下载原版BIOS文件进入微星支持中心搜索主板型号(比如B660M)核对型号准确无误之后,点击左下角的Download(不要点击标题文字)多下载几个版本,个别版本可能无法更改......
  • Golang秒读32GB大文件,如何读取?
    在Go中,处理大文件时,一般采用分块读取的方式,以避免一次性加载整个文件到内存中。以下是读取大文件的简洁步骤:1 打开文件: 使用os.Open打开文件。file, err := os.Open("largefile.txt")if err != nil {    log.Fatal(err)}defer file.Close()2 获取文件信息: 使用......