golang 并发原理

参考文章1
参考文章2

总结:
1. 使用同步阻塞IO多路复用模型,以epoll为基础,当IO阻塞,fd加入epoll_wait,当IO可处理,将以回调的形式通知G(协程)。
2. goroutine,golang语言内部维护G(协程)、M(内核线程)、P(处理队列)和Seched (调度器),由调度器负责调度任务切换,保证处理队列里的任务,更好在内核线程进行调度,所以协程是运行在线程上,但是它由程序进行调度控制的,具体算法:work stealing。

GOMAXPROCS

runtime.GOMAXPROCS(num)
函数用于配置go运行使用的最大处理器
参考连接
golang 比较适合cpu密集型应用,IO密集型会导致cpu的切换。

在Go语言中实现高并发秒杀通常会采用以下几个关键原理: 1. **协程(Goroutine)**:Go的轻量级线程,通过`go`关键字创建新的协程,利用其并行处理的能力,每个用户请求可以独立运行,避免了全局锁带来的性能瓶颈。 2. **通道(Channels)**:用于进程间通信的数据结构,它们允许协程安全地传递数据。在秒杀场景中,可以设置一个通道来同步商品库存,当库存减少到零时,关闭通道,防止并发访问导致库存错误。 3. **共享状态锁(Mutex)**:尽管Go的并发模型相对无锁,但在一些需要互斥操作的地方(如数据库操作),还是可能需要使用`sync.Mutex`或其他类似机制保证原子性。 4. **限流(Limiter)**:为了避免瞬间大量请求冲击系统,可以使用滑动窗口算法或者其他限流策略,控制每秒允许多少次尝试购买。 5. **分布式锁定(Distributed Locking)**:如果秒杀需求非常大,可能会涉及到分布式环境,这时可能需要分布式锁服务(如Redisson)来协调资源。 6. **幂等性原则(Idempotency)】:设计API时,确保多次相同的请求结果是一样的,用户无论是否抢购成功,再次发起请求都应该得到同样的状态反馈。 **示例代码概览**: ```go package main import ( "fmt" "sync" "time" ) type Product struct { name string _stock int mutex sync.Mutex available chan bool } func (p *Product) buy() { p.mutex.Lock() if p.stock > 0 { p.stock-- p.available <- true // 如果还有库存,发送信号给其他协程 } else { fmt.Println(p.name, "sold out!") } p.mutex.Unlock() } func main() { product := &Product{name: "秒杀商品", _stock: 100, available: make(chan bool)} for i := 0; i < 1000; i++ { go func() { time.Sleep(time.Nanosecond*100) // 模拟网络延迟 _ = product.buy() }() } // 关闭通道,表示所有商品已售完 close(product.available) } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值