Maison >développement back-end >Golang >Go peut-il remplacer efficacement ThreadLocal de Java pour les données spécifiques au contexte ?

Go peut-il remplacer efficacement ThreadLocal de Java pour les données spécifiques au contexte ?

DDD
DDDoriginal
2024-12-21 00:20:09213parcourir

Can Go Effectively Replace Java's ThreadLocal for Context-Specific Data?

Données spécifiques au contexte dans Go : une alternative au ThreadLocal de Java

Lorsque vous travaillez avec des routines Go, la possibilité d'accéder à des données spécifiques au contexte peut être crucial pour suivre les métriques ou effectuer des opérations basées sur des informations spécifiques à la demande. Pour y parvenir en Java, la classe ThreadLocal est souvent utilisée pour stocker les données associées au thread actuel.

Go peut-il émuler le ThreadLocal de Java ?

Go fournit-il un mécanisme pour ThreadLocal de Java ? La réponse n'est pas simple.

Approches alternatives

  • Package Goroutine Local Storage (gls) :
    Ce tiers Le package implémente le stockage local goroutine, vous permettant d'associer des données à des goroutines spécifiques. Cependant, la mise en œuvre a ses complexités et peut ne pas convenir à tous les scénarios.
  • Transmission explicite du contexte :
    L'équipe Go recommande de transmettre explicitement le contexte en tant qu'arguments de fonction au lieu de s'appuyer sur goroutine. stockage local. Cette méthode est plus explicite et offre un meilleur contrôle sur le partage de données.

Package contextuel de Go

Le package contextuel de Go offre un moyen plus propre de transmettre les requêtes. informations spécifiques sur les fonctions et les goroutines. Il fournit des objets de contexte qui peuvent être facilement créés, propagés et annulés.

Exemple

Pour mesurer le temps d'accès à la base de données dans une requête, vous pouvez créer un contexte avec une date limite et transmettez-la à la fonction d'accès à la base de données comme argument :

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

var startTime sync.Map

func getDBAccessTime(ctx context.Context, query string) (time.Duration, error) {
    t := startTime.Load(ctx)
    if t == nil {
        t = time.Now()
        startTime.Store(ctx, t)
    }
    startTimeStamp := t.(time.Time)
    // Database access logic
    return time.Since(startTimeStamp), nil
}

func main() {
    ctx := context.Background()
    ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
    defer cancel()
    duration, err := getDBAccessTime(ctx, "SELECT * FROM users")
    fmt.Printf("Database access time: %s\n", duration)
}

En passant explicitement le contexte, vous pouvez vous assurer que les données sont partagées uniquement dans le délai souhaité portée et avoir un meilleur contrôle sur sa durée de vie.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn