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
posted @ 2025-03-19 09:33  rincloud  阅读(16)  评论(0)    收藏  举报