golang 不同参数并行执行 相同参数串行执行
package main import ( "fmt" "sync" "time" ) var ( // 使用 sync.Map 存储参数到锁的映射(并发安全) locks = sync.Map{} ) // SafeExecute 保证相同参数的调用互斥执行 func SafeExecute(param string, fn func()) { // 获取或创建锁(不存在时自动初始化) lock, _ := locks.LoadOrStore(param, &sync.Mutex{}) mutex := lock.(*sync.Mutex) mutex.Lock() defer mutex.Unlock() fmt.Printf("Executing param: %s\n", param) fn() // 执行实际逻辑 } func main() { // 模拟并发调用 for i := 0; i < 5; i++ { go func(id int) { // 所有调用参数为 "A" 的会互斥执行 SafeExecute("A", func() { time.Sleep(1 * time.Second) // 模拟耗时操作 fmt.Printf("Goroutine %d done\n", id) currentTime := time.Now() fmt.Println("当前时间A:", currentTime) }) }(i) } // 不同参数的调用可并发执行 for i := 0; i < 5; i++ { go func(id int) { SafeExecute("B", func() { time.Sleep(1 * time.Second) fmt.Printf("Goroutine %d (B) done\n", id) currentTime := time.Now() fmt.Println("当前时间B:", currentTime) }) }(i) } time.Sleep(30 * time.Second) // 等待所有任务完成 }
执行结果 A B之间是并行的 A之间是串行的
Executing param: A Executing param: B Goroutine 0 (B) done Goroutine 2 done 当前时间B: 2025-03-19 00:31:17.698947292 +0800 CST m=+1.000749932 Executing param: B 当前时间A: 2025-03-19 00:31:17.699066643 +0800 CST m=+1.000869268 Executing param: A Goroutine 3 done 当前时间A: 2025-03-19 00:31:18.700032603 +0800 CST m=+2.001835234 Executing param: A Goroutine 4 (B) done 当前时间B: 2025-03-19 00:31:18.700121535 +0800 CST m=+2.001924184 Executing param: B Goroutine 0 done Goroutine 2 (B) done 当前时间B: 2025-03-19 00:31:19.700341547 +0800 CST m=+3.002144213 Executing param: B 当前时间A: 2025-03-19 00:31:19.700241561 +0800 CST m=+3.002044193 Executing param: A Goroutine 1 done Goroutine 3 (B) done 当前时间B: 2025-03-19 00:31:20.701249451 +0800 CST m=+4.003052081 当前时间A: 2025-03-19 00:31:20.701221247 +0800 CST m=+4.003023892 Executing param: B Executing param: A Goroutine 1 (B) done Goroutine 4 done 当前时间B: 2025-03-19 00:31:21.701619083 +0800 CST m=+5.003421717 当前时间A: 2025-03-19 00:31:21.701665829 +0800 CST m=+5.003468469

浙公网安备 33010602011771号