J'utilise Go maps comme mémoire cache et canaux pour assurer un accès synchrone.Y a-t-il une meilleure façon d'utiliser les canaux pour assurer un accès synchrone à la carte?
Mon paquet « session » définit le cache comme: carte [chaîne] * SessionData
SessionData est un struct également défini dans le paquet, ainsi que d'autres fonctions d'accès comme on le voit dans le code.
GetWebPage(rw http.ResponseWriter, req *http.Request) {
var sd *session.SessionData
var sessTkn string
cookie, err := req.Cookie("sesstoken")
if err == nil { // cookie found
sessTkn = cookie.Value
// Check for cache entry for this token,
// using a channel to protect the map and return
// a pointer to the cached data if it exists
sdc := make(chan *session.SessionData, 1)
go session.GetSessionFromCache(sessTkn, sdc)
sd = <-sdc
if sd == nil { // sessTkn not in the cache
// This is test data to simplify example
sv := make([]string, 4)
sv[0] = sessTkn
iv := make([]int, 3)
iv[0] = 100
iv[1] = 1000
sdc := make(chan *session.SessionData, 1)
go session.NewSessionData(sv, iv, false, false, sdc)
session.SC[sessTkn] = <-sdc
}
// Is this necessary? Is there a better way?
// ---------------------------------------
if sd == nil {
sdc = make(chan *session.SessionData, 1)
go session.GetSessionFromCache(sessTkn, sdc)
sd = <-sdc
}
// ---------------------------------------
fmt.Println(sd) // just to prove that it works in both cases
}
// The rest of the handler code follows
Pour assurer un accès synchrone, vous pouvez utiliser [paquet Sémaphore dans Go] (https://github.com/kamilsk/semaphore) –
@Hamza Merci pour la suggestion. Dans mon cas, un sémaphore à usage général sacrifie la capacité à communiquer (envoyer et recevoir des données typées sur le canal). Comme un effet secondaire souhaitable, le canal bloque l'accès à la carte, assurant un accès asynchrone. Aucune des fonctions d'accès ne peut être qualifiée de "levage lourd". Le code fonctionne, Ma seule préoccupation est la répétition nécessaire pour vérifier qu'une nouvelle entrée a été ajoutée à la carte. – emadera52