Maison  >  Article  >  développement back-end  >  Synchronisation et optimisation des performances dans le modèle de concurrence Golang

Synchronisation et optimisation des performances dans le modèle de concurrence Golang

WBOY
WBOYoriginal
2023-09-29 13:12:312198parcourir

Synchronisation et optimisation des performances dans le modèle de concurrence Golang

Synchronisation et optimisation des performances dans le modèle de concurrence Golang

Introduction :
Avec le développement continu de la technologie informatique et la popularité des processeurs multicœurs, comment utiliser efficacement les ressources multicœurs et améliorer les performances du programme est devenu un problème important dans le domaine du développement de logiciels. En tant que langage de programmation simultanée, Golang fournit une multitude de primitives et de bibliothèques de concurrence, permettant aux programmeurs de tirer pleinement parti des processeurs multicœurs et de réduire la complexité de la programmation simultanée. Cet article présentera le mécanisme de synchronisation et les méthodes d'optimisation des performances dans le modèle de concurrence Golang, et fournira des exemples de code spécifiques.

1. Mécanisme de synchronisation

  1. Mutex (Mutex)
    Mutex (Mutex) est l'un des mécanismes de synchronisation les plus basiques de Golang. Grâce aux opérations de verrouillage et de déverrouillage du mutex, il est possible de garantir qu'un seul thread peut exécuter le code de la section critique protégée en même temps, évitant ainsi les conditions de concurrence et la concurrence des données entre plusieurs threads.
import "sync"

var mu sync.Mutex
var balance int

func Deposit(amount int) {
    mu.Lock()
    defer mu.Unlock()
    balance += amount
}

func main() {
    wg := sync.WaitGroup{}
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            Deposit(100)
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(balance)
}
  1. Variable de condition (Cond)
    La variable de condition (Cond) est un mécanisme utilisé pour la communication inter-thread dans Golang. Elle permet à un thread d'attendre qu'un autre thread remplisse une certaine condition avant de poursuivre l'exécution.
import "sync"

var (
    mu      sync.Mutex
    deposit = 0
    cond    = sync.NewCond(&mu)
)

func Deposit(amount int) {
    mu.Lock()
    defer mu.Unlock()
    deposit += amount
    cond.Signal() // 通知等待的线程
}

func Withdraw(amount int) {
    mu.Lock()
    defer mu.Unlock()
    for deposit < amount { // 判断条件是否满足
        cond.Wait() // 等待条件变量的信号
    }
    deposit -= amount
}

func main() {
    go Deposit(100)
    go Withdraw(100)
}
  1. Semaphore
    Le sémaphore est un mécanisme utilisé pour contrôler l'accès aux ressources partagées. Il peut limiter le nombre de threads pouvant accéder à une ressource en même temps.
import "sync"

var (
    sem     = make(chan struct{}, 10) // 限制同时访问资源的线程数量为10
    balance int
)

func Deposit(amount int) {
    sem <- struct{}{} // 获取信号量
    balance += amount
    <-sem // 释放信号量
}

func main() {
    wg := sync.WaitGroup{}
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            Deposit(100)
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(balance)
}

2. Méthodes d'optimisation des performances

  1. Parallélisation
    La parallélisation est une méthode permettant d'améliorer les performances d'un programme en exécutant plusieurs tâches en même temps. Dans Golang, la parallélisation peut être obtenue en combinant goroutine et canal.
func ParallelProcess(data []int) {
    c := make(chan int)
    for i := 0; i < len(data); i++ {
        go func(d int) {
            result := Process(d)
            c <- result
        }(data[i])
    }
    for i := 0; i < len(data); i++ {
        <-c
    }
}
  1. Traitement par lots
    Le traitement par lots est une méthode de fusion de plusieurs petites tâches en une seule grande tâche pour améliorer les performances du programme. Dans Golang, le traitement par lots peut être implémenté via WaitGroup dans le package de synchronisation.
func BatchProcess(data []int) {
    wg := sync.WaitGroup{}
    for i := 0; i < len(data); i++ {
        wg.Add(1)
        go func(d int) {
            Process(d)
            wg.Done()
        }(data[i])
    }
    wg.Wait()
}
  1. Programmation sans verrouillage
    La programmation sans verrouillage est une méthode permettant d'améliorer les performances du programme en évitant l'utilisation de verrous mutex. Dans Golang, vous pouvez utiliser des opérations atomiques et des opérations CAS (Compare And Swap) pour obtenir une programmation sans verrouillage.
import "sync/atomic"

var balance int32

func Deposit(amount int) {
    atomic.AddInt32(&balance, int32(amount))
}

func main() {
    wg := sync.WaitGroup{}
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            Deposit(100)
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(balance)
}

Conclusion :
Golang fournit de riches primitives et bibliothèques de concurrence qui permettent aux programmeurs de tirer pleinement parti des processeurs multicœurs et de réduire la complexité de la programmation simultanée. En sélectionnant et en utilisant rationnellement des mécanismes de synchronisation et des méthodes d'optimisation des performances, nous pouvons améliorer les performances de concurrence et la réactivité du programme. Cependant, il est nécessaire d'évaluer la relation entre la synchronisation et les performances en fonction de scénarios et d'exigences d'application spécifiques, et de choisir les méthodes et outils les plus appropriés pour résoudre le problème.

Références :

  • Documentation officielle de Golang : https://golang.org/
  • Concurrence Golang : https://go.dev/blog/concurrency-is-not-parallelism

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