Maison développement back-end Golang Application pratique du package Golang Sync pour améliorer les performances du programme

Application pratique du package Golang Sync pour améliorer les performances du programme

Sep 28, 2023 am 08:17 AM
同步 并发

Golang Sync包在提高程序性能中的实际应用

Application pratique du package Golang Sync pour améliorer les performances du programme

Vue d'ensemble
Golang est un langage de programmation open source doté de puissantes fonctionnalités de programmation simultanée. Dans le processus de programmation simultanée, afin de garantir la cohérence des données et d'éviter les conditions de concurrence, des primitives de synchronisation doivent être utilisées. Golang fournit le package Sync, qui inclut certains mécanismes de synchronisation couramment utilisés, tels que les verrous mutex, les verrous en lecture-écriture, les variables de condition, etc. Ces mécanismes de synchronisation peuvent nous aider à améliorer les performances et l'efficacité de nos programmes.

Mutex (Mutex)
Mutex est le mécanisme de synchronisation le plus basique du package Sync, utilisé pour protéger l'accès aux ressources partagées. En utilisant un verrou mutex, nous pouvons garantir qu'un seul thread peut accéder à la ressource partagée en même temps. Voici un exemple de code utilisant un mutex :

package main

import (
    "fmt"
    "sync"
)

var (
    counter int
    mutex   sync.Mutex
    wg      sync.WaitGroup
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment()
    }

    wg.Wait()
    fmt.Println("Counter:", counter)
}

func increment() {
    mutex.Lock()
    defer mutex.Unlock()

    counter++

    wg.Done()
}
Copier après la connexion

Dans l'exemple ci-dessus, nous définissons d'abord un verrou mutex. Dans la fonction d'incrémentation, nous acquérons d'abord le verrou en appelant mutex.Lock(), puis effectuons l'opération qui doit être protégée (ici, incrémenter le compteur), et enfin appelons mutex.Unlock() pour libérer le verrou. Cela garantit qu'un seul goroutine peut exécuter ce code en même temps, évitant ainsi les conditions de concurrence.

Verrouillage en lecture-écriture (RWMutex)
Le verrouillage en lecture-écriture est un mécanisme de synchronisation plus avancé, qui peut verrouiller les opérations de lecture et d'écriture séparément. Dans les scénarios où il y a beaucoup de lectures et peu d'écritures, l'utilisation de verrous en lecture-écriture peut améliorer considérablement les performances du programme. Voici un exemple de code utilisant un verrou en lecture-écriture :

package main

import (
    "fmt"
    "sync"
)

var (
    resource int
    rwMutex  sync.RWMutex
    wg       sync.WaitGroup
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go read()
    }

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go write()
    }

    wg.Wait()
    fmt.Println("Resource:", resource)
}

func read() {
    rwMutex.RLock()
    defer rwMutex.RUnlock()

    fmt.Println("Read:", resource)

    wg.Done()
}

func write() {
    rwMutex.Lock()
    defer rwMutex.Unlock()

    resource++
    fmt.Println("Write:", resource)

    wg.Done()
}
Copier après la connexion

Dans l'exemple ci-dessus, nous définissons d'abord un verrou en lecture-écriture rwMutex. Dans la fonction de lecture, nous acquérons le verrou de lecture en appelant rwMutex.RLock(), puis effectuons l'opération de lecture (voici la valeur actuelle de la ressource de sortie). Dans la fonction d'écriture, nous obtenons le verrou d'écriture en appelant rwMutex.Lock(), puis effectuons l'opération d'écriture (ici, la ressource est auto-incrémentée). En utilisant des verrous en lecture-écriture, nous pouvons obtenir plusieurs goroutines lisant les ressources en même temps, mais une seule goroutine peut effectuer des opérations d'écriture.

Variable de condition (Cond)
La variable de condition est un autre mécanisme de synchronisation important dans le package Sync, qui peut nous aider à transmettre des signaux entre plusieurs goroutines. En utilisant des variables de condition, nous pouvons implémenter certaines opérations de synchronisation complexes, comme attendre que des conditions spécifiées soient remplies avant de passer à l'étape suivante. Voici un exemple de code utilisant une variable de condition :

package main

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

var (
    ready  bool
    mutex  sync.Mutex
    cond   *sync.Cond
    wg     sync.WaitGroup
)

func main() {
    runtime.GOMAXPROCS(runtime.NumCPU())

    mutex.Lock()
    
    cond = sync.NewCond(&mutex)
    
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go waitForSignal()
    }

    time.Sleep(time.Second * 2)
    fmt.Println("SENDING SIGNAL")
    cond.Signal()

    time.Sleep(time.Second * 2)
    fmt.Println("SENDING SIGNAL")
    cond.Signal()

    time.Sleep(time.Second * 2)
    fmt.Println("SENDING SIGNAL")
    cond.Signal()

    wg.Wait()
}

func waitForSignal() {
    cond.L.Lock()
    defer cond.L.Unlock()

    fmt.Println("WAITING FOR SIGNAL")
    cond.Wait()
    fmt.Println("GOT SIGNAL")

    wg.Done()
}
Copier après la connexion

Dans l'exemple ci-dessus, nous créons d'abord une variable de condition cond à l'aide de la fonction sync.NewCond() et l'associons au mutex de verrouillage mutex. Dans la fonction waitForSignal, on acquiert d'abord le verrou de la variable de condition en appelant cond.L.Lock(), puis on appelle cond.Wait() pour attendre l'arrivée du signal, et enfin on appelle cond.L.Unlock() pour libérer le verrou. Dans la fonction principale, nous envoyons un signal en appelant cond.Signal() pour avertir toutes les goroutines en attente. En utilisant des variables de condition, nous pouvons réaliser une collaboration entre plusieurs goroutines pour réaliser des opérations de synchronisation plus complexes.

Résumé
Le package Golang Sync fournit certains mécanismes de synchronisation couramment utilisés, tels que les verrous mutex, les verrous en lecture-écriture et les variables de condition, qui peuvent nous aider à améliorer les performances et l'efficacité de nos programmes. Les verrous mutex sont utilisés pour protéger l'accès aux ressources partagées. Les verrous en lecture-écriture peuvent améliorer les performances dans les scénarios où il y a plus de lecture et moins d'écriture. Les variables de condition peuvent implémenter la transmission de signaux entre plusieurs goroutines. Dans les applications pratiques, nous pouvons choisir le mécanisme de synchronisation approprié en fonction de besoins spécifiques et le mettre en œuvre conjointement avec un code spécifique, améliorant ainsi la qualité et les performances du programme.

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Application de la concurrence et des coroutines dans la conception de l'API Golang Application de la concurrence et des coroutines dans la conception de l'API Golang May 07, 2024 pm 06:51 PM

La concurrence et les coroutines sont utilisées dans la conception GoAPI pour : Traitement hautes performances : traiter plusieurs requêtes simultanément pour améliorer les performances. Traitement asynchrone : utilisez des coroutines pour traiter des tâches (telles que l'envoi d'e-mails) de manière asynchrone, libérant ainsi le thread principal. Traitement des flux : utilisez des coroutines pour traiter efficacement les flux de données (tels que les lectures de bases de données).

Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Comment la concurrence et le multithreading des fonctions Java peuvent-ils améliorer les performances ? Apr 26, 2024 pm 04:15 PM

Les techniques de concurrence et de multithreading utilisant les fonctions Java peuvent améliorer les performances des applications, notamment en suivant les étapes suivantes : Comprendre les concepts de concurrence et de multithreading. Tirez parti des bibliothèques de concurrence et multithread de Java telles que ExecutorService et Callable. Pratiquez des cas tels que la multiplication matricielle multithread pour réduire considérablement le temps d'exécution. Profitez des avantages d’une vitesse de réponse accrue des applications et d’une efficacité de traitement optimisée grâce à la concurrence et au multithreading.

Quelle est la différence entre les iPhones verrouillés et déverrouillés ? Introduction détaillée : Comparaison des différences entre les iPhones verrouillés et déverrouillés ? Quelle est la différence entre les iPhones verrouillés et déverrouillés ? Introduction détaillée : Comparaison des différences entre les iPhones verrouillés et déverrouillés ? Mar 28, 2024 pm 03:10 PM

Le téléphone mobile Apple est le téléphone mobile le plus largement choisi par les gens récemment, mais nous voyons souvent des gens discuter en ligne de la différence entre les téléphones mobiles Apple verrouillés et déverrouillés, et ils se demandent lequel acheter. Aujourd'hui, Chen Siqi partagera avec vous la différence entre les iPhones verrouillés et déverrouillés et vous aidera à résoudre les problèmes. En fait, il n’y a pas beaucoup de différence entre les deux en termes d’apparence et de fonction. La clé réside dans le prix et l’utilisation. Qu'est-ce qu'une version verrouillée et une version déverrouillée ? Un iPhone sans restrictions de verrouillage signifie qu'il n'est pas limité par l'opérateur et que la carte SIM de n'importe quel opérateur peut être utilisée normalement. Une version verrouillée signifie qu'elle dispose d'un verrouillage réseau et ne peut utiliser que la carte SIM fournie par l'opérateur désigné et ne peut pas en utiliser d'autres. En fait, les téléphones Apple déverrouillés peuvent utiliser le mobile,

Comment la connexion à la base de données Java gère-t-elle les transactions et la concurrence ? Comment la connexion à la base de données Java gère-t-elle les transactions et la concurrence ? Apr 16, 2024 am 11:42 AM

Les transactions garantissent l'intégrité des données de la base de données, y compris l'atomicité, la cohérence, l'isolation et la durabilité. JDBC utilise l'interface Connection pour assurer le contrôle des transactions (setAutoCommit, commit, rollback). Les mécanismes de contrôle de concurrence coordonnent les opérations simultanées, à l'aide de verrous ou d'un contrôle de concurrence optimiste/pessimiste pour obtenir une isolation des transactions afin d'éviter les incohérences des données.

Comment la fonction de verrouillage dans Golang est-elle implémentée ? Comment la fonction de verrouillage dans Golang est-elle implémentée ? Jun 05, 2024 pm 12:39 PM

Les verrous dans le langage Go implémentent un code concurrent synchronisé pour empêcher la concurrence des données : Mutex : verrouillage Mutex, qui garantit qu'un seul goroutine acquiert le verrou en même temps et est utilisé pour le contrôle des sections critiques. RWMutex : verrouillage en lecture-écriture, qui permet à plusieurs goroutines de lire des données en même temps, mais une seule goroutine peut écrire des données en même temps. Il convient aux scénarios nécessitant une lecture et une écriture fréquentes de données partagées.

Un guide pour les tests unitaires des fonctions simultanées Go Un guide pour les tests unitaires des fonctions simultanées Go May 03, 2024 am 10:54 AM

Les tests unitaires des fonctions simultanées sont essentiels car cela permet de garantir leur comportement correct dans un environnement simultané. Des principes fondamentaux tels que l'exclusion mutuelle, la synchronisation et l'isolement doivent être pris en compte lors du test de fonctions concurrentes. Les fonctions simultanées peuvent être testées unitairement en simulant, en testant les conditions de concurrence et en vérifiant les résultats.

Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Comment utiliser les classes atomiques dans la concurrence des fonctions Java et le multithreading ? Apr 28, 2024 pm 04:12 PM

Les classes atomiques sont des classes thread-safe en Java qui fournissent des opérations ininterrompues et sont cruciales pour garantir l'intégrité des données dans des environnements concurrents. Java fournit les classes atomiques suivantes : AtomicIntegerAtomicLongAtomicReferenceAtomicBoolean Ces classes fournissent des méthodes pour obtenir, définir et comparer des valeurs afin de garantir que l'opération est atomique et ne sera pas interrompue par des threads. Les classes atomiques sont utiles lorsque vous travaillez avec des données partagées et évitez la corruption des données, comme la gestion de compteurs partagés pour les accès simultanés.

Planification des processus Golang : optimiser l'efficacité de l'exécution simultanée Planification des processus Golang : optimiser l'efficacité de l'exécution simultanée Apr 03, 2024 pm 03:03 PM

La planification des processus Go utilise un algorithme coopératif. Les méthodes d'optimisation incluent : l'utilisation de coroutines légères autant que possible pour allouer raisonnablement les coroutines afin d'éviter de bloquer les opérations et d'utiliser des verrous et des primitives de synchronisation.

See all articles