Maison développement back-end Golang Comment le mécanisme de synchronisation dans Golang améliore les performances

Comment le mécanisme de synchronisation dans Golang améliore les performances

Sep 29, 2023 pm 07:21 PM
golang 性能提升 Mécanisme de synchronisation

Comment le mécanisme de synchronisation dans Golang améliore les performances

La façon dont le mécanisme de synchronisation dans Golang améliore les performances nécessite des exemples de code spécifiques

Introduction :
Avec le développement de la technologie informatique et réseau, la programmation multicœur et concurrente est devenue des problèmes qui ne peuvent être ignorés dans le développement quotidien. En tant que langage de programmation concurrent, le langage Go atteint des performances élevées et une concurrence élevée grâce à ses mécanismes uniques Goroutine et Channel. Cependant, en programmation simultanée, la gestion correcte de la synchronisation est essentielle pour améliorer les performances. Cet article présentera plusieurs mécanismes de synchronisation courants dans Golang et démontrera comment améliorer les performances grâce à des exemples de code spécifiques.

1. Mutex (Mutex)
Mutex est l'un des mécanismes de synchronisation les plus basiques. Il garantit qu'un seul Goroutine peut accéder aux ressources partagées en même temps en verrouillant et déverrouillant les ressources partagées. Dans les scénarios à forte concurrence, l’utilisation de verrous mutex peut efficacement éviter la concurrence entre les ressources et l’incohérence des données.

Ce qui suit est un exemple de code utilisant un verrou mutex :

package main

import (
    "fmt"
    "sync"
)

var counter int
var mutex sync.Mutex

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    fmt.Println("Counter:", counter)
}

func increment() {
    mutex.Lock()
    defer mutex.Unlock()
    counter++
}
Copier après la connexion

Dans le code ci-dessus, nous définissons une variable globale counter et un verrou mutex mutex. Dans la fonction increment, nous utilisons mutex.Lock() pour verrouiller afin de garantir que le segment de code de section critique ne peut être exécuté que par un seul Goroutine à la fois. Une fois la section de code de la section critique terminée, nous utilisons mutex.Unlock() pour déverrouiller et permettre aux autres Goroutines de continuer à y accéder. counter和一个互斥锁mutex。在increment函数中,我们使用mutex.Lock()来加锁,确保该临界区代码段同一时间只能被一个Goroutine执行。在临界区代码段结束之后,我们使用mutex.Unlock()来解锁,允许其他Goroutine继续访问。

二、条件变量(Cond)
条件变量是在互斥锁的基础上扩展的一种同步机制,它可以根据特定条件来挂起和唤醒Goroutine。在一些需要等待特定条件满足后再继续执行的场景中,使用条件变量可以提高性能并降低资源的消耗。

下面是一个使用条件变量的示例代码:

package main

import (
    "fmt"
    "sync"
)

var message string
var ready bool
var mutex sync.Mutex
var cond = sync.NewCond(&mutex)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            waitForReady(index)
        }(i)
    }
    wg.Wait()
}

func waitForReady(index int) {
    mutex.Lock()
    for !ready {
        cond.Wait()
    }
    fmt.Printf("Goroutine %d - Message: %s
", index, message)
    mutex.Unlock()
}

func updateMessage(msg string) {
    mutex.Lock()
    message = msg
    ready = true
    cond.Broadcast()
    mutex.Unlock()
}
Copier après la connexion

在上述代码中,我们定义了一个全局变量message和一个布尔变量ready,以及一个互斥锁mutex和一个条件变量cond。在waitForReady函数中,我们使用cond.Wait()来等待条件满足,如果条件不满足,Goroutine会被挂起,直到其他Goroutine通过cond.Broadcast()cond.Signal()来唤醒。而在updateMessage函数中,我们通过cond.Broadcast()来通知等待的Goroutine条件已经满足,可以继续执行。

三、读写锁(RWMutex)
读写锁是一种特殊的互斥锁,它允许多个Goroutine同时读取共享资源,但只允许一个Goroutine写入共享资源。读写锁适用于读多写少的场景,可以提高并发读取的性能。

下面是一个使用读写锁的示例代码:

package main

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

var counter int
var rwMutex sync.RWMutex

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            readData(index)
        }(i)
    }
    for i := 0; i < 2; i++ {
        wg.Add(1)
        go func(index int) {
            defer wg.Done()
            writeData(index)
        }(i)
    }
    wg.Wait()
}

func readData(index int) {
    rwMutex.RLock()
    defer rwMutex.RUnlock()
    fmt.Printf("Goroutine %d - Counter: %d
", index, counter)
}

func writeData(index int) {
    rwMutex.Lock()
    defer rwMutex.Unlock()
    counter++
    fmt.Printf("Goroutine %d - Counter: %d
", index, counter)
    time.Sleep(time.Second)
}
Copier après la connexion

在上述代码中,我们定义了一个全局变量counter和一个读写锁rwMutex。在readData函数中,我们使用rwMutex.RLock()来加读锁,允许多个Goroutine同时访问共享资源。而在writeData函数中,我们使用rwMutex.Lock()

2. Variable de condition (Cond)

La variable de condition est un mécanisme de synchronisation étendu sur la base du verrouillage mutex. Elle peut suspendre et réveiller Goroutine selon des conditions spécifiques. Dans certains scénarios où vous devez attendre que des conditions spécifiques soient remplies avant de poursuivre l'exécution, l'utilisation de variables de condition peut améliorer les performances et réduire la consommation de ressources.

Ce qui suit est un exemple de code utilisant des variables de condition :

rrreee

Dans le code ci-dessus, nous définissons une variable globale message et une variable booléenne ready, ainsi qu'un Un verrou d'exclusion interactif mutex et une variable de condition cond. Dans la fonction waitForReady, nous utilisons cond.Wait() pour attendre que la condition soit remplie. Si la condition n'est pas remplie, Goroutine sera suspendu jusqu'à ce que d'autres Goroutine passent. cond .Broadcast() ou cond.Signal() pour se réveiller. Dans la fonction updateMessage, nous utilisons cond.Broadcast() pour informer le Goroutine en attente que les conditions ont été remplies et que l'exécution peut continuer.
  • 3. Verrouillage en lecture-écriture (RWMutex)
  • Le verrouillage en lecture-écriture est un verrou mutex spécial qui permet à plusieurs Goroutines de lire des ressources partagées en même temps, mais ne permet qu'à un seul Goroutine d'écrire sur des ressources partagées. Les verrous en lecture-écriture conviennent aux scénarios dans lesquels il y a plus de lecture et moins d'écriture, et peuvent améliorer les performances de lecture simultanée.
  • Ce qui suit est un exemple de code utilisant un verrou en lecture-écriture :
  • rrreee
  • Dans le code ci-dessus, nous définissons une variable globale counter et un verrou en lecture-écriture rwMutex . Dans la fonction readData, nous utilisons rwMutex.RLock() pour ajouter un verrou en lecture, permettant à plusieurs Goroutines d'accéder aux ressources partagées en même temps. Dans la fonction writeData, nous utilisons rwMutex.Lock() pour ajouter un verrou en écriture, permettant à un seul Goroutine d'écrire sur la ressource partagée.
🎜Conclusion : 🎜En utilisant rationnellement les verrous mutex, les variables de condition et les verrous en lecture-écriture, nous pouvons améliorer efficacement les performances des programmes Golang. Les verrous mutex conviennent à la lecture et à l'écriture de ressources partagées, les variables de condition conviennent à l'attente de conditions spécifiques avant de poursuivre l'exécution, et les verrous en lecture-écriture conviennent à la lecture plus et à l'écriture de moins. Une utilisation appropriée de ces mécanismes de synchronisation peut garantir la cohérence des données, éviter la concurrence entre les ressources et améliorer les performances de l'accès simultané. 🎜🎜Références : 🎜🎜🎜https://golang.org/pkg/sync/🎜🎜https://gobyexample.com/mutexes🎜🎜https://golangbot.com/sync-waitgroup/🎜🎜

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)

Comment lire et écrire des fichiers en toute sécurité avec Golang ? Comment lire et écrire des fichiers en toute sécurité avec Golang ? Jun 06, 2024 pm 05:14 PM

Lire et écrire des fichiers en toute sécurité dans Go est crucial. Les directives incluent : Vérification des autorisations de fichiers Fermeture de fichiers à l'aide de reports Validation des chemins de fichiers Utilisation de délais d'attente contextuels Le respect de ces directives garantit la sécurité de vos données et la robustesse de vos applications.

Golang Framework vs Go Framework : comparaison de l'architecture interne et des fonctionnalités externes Golang Framework vs Go Framework : comparaison de l'architecture interne et des fonctionnalités externes Jun 06, 2024 pm 12:37 PM

La différence entre le framework GoLang et le framework Go se reflète dans l'architecture interne et les fonctionnalités externes. Le framework GoLang est basé sur la bibliothèque standard Go et étend ses fonctionnalités, tandis que le framework Go se compose de bibliothèques indépendantes pour atteindre des objectifs spécifiques. Le framework GoLang est plus flexible et le framework Go est plus facile à utiliser. Le framework GoLang présente un léger avantage en termes de performances et le framework Go est plus évolutif. Cas : gin-gonic (framework Go) est utilisé pour créer l'API REST, tandis qu'Echo (framework GoLang) est utilisé pour créer des applications Web.

Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Transformant du développement frontal au développement back-end, est-il plus prometteur d'apprendre Java ou Golang? Apr 02, 2025 am 09:12 AM

Chemin d'apprentissage du backend: le parcours d'exploration du front-end à l'arrière-end en tant que débutant back-end qui se transforme du développement frontal, vous avez déjà la base de Nodejs, ...

c Quelles sont les différences entre les trois méthodes de mise en œuvre de la lecture multithre c Quelles sont les différences entre les trois méthodes de mise en œuvre de la lecture multithre Apr 03, 2025 pm 03:03 PM

Le multithreading est une technologie importante dans la programmation informatique et est utilisée pour améliorer l'efficacité de l'exécution du programme. Dans le langage C, il existe de nombreuses façons d'implémenter le multithreading, y compris les bibliothèques de threads, les threads POSIX et l'API Windows.

C Programmation multithread du langage: Guide du débutant et dépannage C Programmation multithread du langage: Guide du débutant et dépannage Apr 04, 2025 am 10:15 AM

C Guide de programmation multithreading Language: Création de threads: Utilisez la fonction PTHREAD_CREATE () pour spécifier l'ID de thread, les propriétés et les fonctions de thread. Synchronisation des threads: empêchez la concurrence des données via des mutex, des sémaphores et des variables conditionnelles. Cas pratique: utilisez le multi-lancement pour calculer le numéro Fibonacci, attribuer des tâches à plusieurs threads et synchroniser les résultats. Dépannage: résoudre des problèmes tels que les accidents de programme, les réponses d'arrêt de fil et les goulots d'étranglement des performances.

Comment utiliser un fuseau horaire prédéfini avec Golang ? Comment utiliser un fuseau horaire prédéfini avec Golang ? Jun 06, 2024 pm 01:02 PM

L'utilisation de fuseaux horaires prédéfinis dans Go comprend les étapes suivantes : Importez le package « time ». Chargez un fuseau horaire spécifique via la fonction LoadLocation. Utilisez le fuseau horaire chargé dans des opérations telles que la création d'objets Time, l'analyse de chaînes horaires et l'exécution de conversions de date et d'heure. Comparez les dates en utilisant différents fuseaux horaires pour illustrer l'application de la fonctionnalité de fuseau horaire prédéfini.

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Objectif de Golang: Construire des systèmes efficaces et évolutifs Objectif de Golang: Construire des systèmes efficaces et évolutifs Apr 09, 2025 pm 05:17 PM

GO Language fonctionne bien dans la construction de systèmes efficaces et évolutifs. Ses avantages incluent: 1. Haute performance: compilé en code machine, vitesse de course rapide; 2. Programmation simultanée: simplifier le multitâche via les goroutines et les canaux; 3. Simplicité: syntaxe concise, réduction des coûts d'apprentissage et de maintenance; 4. Plate-forme multipliée: prend en charge la compilation multiplateforme, déploiement facile.

See all articles