Golang如何解决重复提交并发问题
在Golang中解决重复提交的并发问题通常涉及到使用锁或其他同步机制来确保同一时间只有一个请求被处理。以下是一个使用sync.Mutex
来避免重复提交的简单示例:
package main
import (
"fmt"
"sync"
)
type SafeSubmitter struct {
mu sync.Mutex
}
func (s *SafeSubmitter) Submit(key string) {
s.mu.Lock()
defer s.mu.Unlock()
// 检查是否已经处理过
if isProcessed(key) {
fmt.Printf("Request with key %s has already been processed.\n", key)
return
}
// 标记为已处理
markProcessed(key)
// 执行实际的提交逻辑
fmt.Printf("Processing request with key %s.\n", key)
// doSubmit()
}
func isProcessed(key string) bool {
// 这里模拟一个检查是否已处理的逻辑
// 实际应用中可能会查询数据库或缓存
return false // 假设没处理过
}
func markProcessed(key string) {
// 这里模拟标记为已处理的逻辑
// 实际应用中可能会将结果写入数据库或缓存
}
func main() {
submitter := SafeSubmitter{}
keys := []string{"key1", "key2", "key1", "key3"}
for _, key := range keys {
go submitter.Submit(key)
}
// 为了清晰展示,主函数会阻塞等待
// 实际应用中,可能会有一个graceful shutdown的逻辑
select {}
}
在这个例子中,SafeSubmitter
结构体包含一个mu
字段,它是一个sync.Mutex
。Submit
方法首先通过调用mu.Lock()
获取互斥锁,然后检查请求是否已经处理过。如果没有处理过,它会标记为已处理,并执行实际的提交逻辑。在并发情况下,由于mu
锁的存在,同一时间只有一个Submit
调用能够执行到关键部分,从而避免了重复提交。
评论已关闭