使用锁来同步访问共享的map。
下面是一个示例代码:
package main
import (
"context"
"fmt"
"sync"
"cloud.google.com/go/pubsub"
)
func main() {
ctx := context.Background()
client, err := pubsub.NewClient(ctx, "my-project-id")
if err != nil {
panic(err)
}
topic := client.Topic("my-topic")
defer topic.Stop()
var mu sync.Mutex
subscriptions := make(map[string]*pubsub.Subscription)
for i := 0; i < 10; i++ {
go func() {
sub, err := client.CreateSubscription(ctx, "my-subscription", pubsub.SubscriptionConfig{
Topic: topic,
AckDeadline: 10 * time.Second,
})
if err != nil {
panic(err)
}
mu.Lock()
subscriptions[sub.ID()] = sub
mu.Unlock()
select {
case <-ctx.Done():
return
case <-sub.Done():
mu.Lock()
delete(subscriptions, sub.ID())
mu.Unlock()
}
}()
}
for {
mu.Lock()
numSubs := len(subscriptions)
mu.Unlock()
fmt.Println("Number of subscriptions:", numSubs)
time.Sleep(time.Second)
}
}
在这个示例代码中,我们创建了一个subscriptions
map来存储所有的Subscription。在创建Subscription时,我们使用了一个mutex锁来同步对map的访问。在Subscription完成后,我们使用Lock和Unlock方法来持有和释放锁,以确保多个goroutine能够安全地访问map。此外,所有访问map的代码都在匿名函数中运行,以确保创建Subscription时的所有访问都在单个goroutine中运行。