Maison  >  Article  >  développement back-end  >  Optimisation de la granularité du verrouillage dans la programmation simultanée de la fonction Golang

Optimisation de la granularité du verrouillage dans la programmation simultanée de la fonction Golang

PHPz
PHPzoriginal
2024-04-17 21:21:021121parcourir

Dans la programmation simultanée fonctionnelle, l'optimisation de la granularité du verrouillage peut améliorer les performances. Les techniques spécifiques comprennent : L'identification et la protection des plages de données minimales (sections critiques). Utilisez des verrous à granularité fine (tels que des mutex ou des verrous en lecture-écriture) pour verrouiller uniquement le code concerné. Utilisez la séparation lecture-écriture pour autoriser plusieurs lectures simultanées ou une seule écriture. Utilisez des structures de données sans verrouillage (telles que des cartes ou des canaux simultanés) pour éviter la surcharge de verrouillage. En optimisant la granularité, les conflits de verrouillage sont réduits et l'évolutivité du code est améliorée.

Optimisation de la granularité du verrouillage dans la programmation simultanée de la fonction Golang

Optimisation de la granularité des verrouillages dans la programmation simultanée des fonctions du langage Go

Dans la programmation simultanée, les verrous sont le mécanisme de base pour coordonner l'accès simultané aux ressources partagées. Cependant, une mauvaise utilisation des verrous peut entraîner des goulots d’étranglement dans les performances. Cet article présentera les techniques d'optimisation de la granularité des verrous dans la programmation fonctionnelle concurrente et les démontrera à l'aide de cas réels.

Qu'est-ce que la granularité du verrouillage ?

La granularité du verrouillage fait référence à la plage de données protégée par le verrou. Plus la granularité est fine, moins le code est affecté par le verrouillage.

Conseils pour optimiser la granularité du verrouillage

  1. Identifiez les sections critiques : Déterminez la plage minimale de données qui doivent être protégées.
  2. Utilisez des verrous à granularité fine : Utilisez des verrous à granularité plus fine (tels que des mutex ou des verrous en lecture-écriture) pour les sections critiques que les verrous globaux.
  3. Séparation lecture-écriture : Utilisez des verrous en lecture-écriture pour autoriser plusieurs opérations de lecture simultanées tout en autorisant une seule opération d'écriture.
  4. Utilisez des structures de données sans verrouillage : Si possible, utilisez des structures de données sans verrouillage telles que des cartes ou des canaux simultanés.

Cas pratique : Ecriture simultanée de fichiers

Nous avons une fonction WriteToFile pour l'écriture simultanée de fichiers : WriteToFile,用于并发写入文件:

func WriteToFile(path string, data []byte) error {
    f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        return err
    }
    defer f.Close()

    if _, err := f.Write(data); err != nil {
        return err
    }
    return nil
}

在此示例中,整个文件都被全局锁保护,即使只有部分数据需要写入。

优化后的版本:

type File struct {
    mtx *sync.Mutex
    file *os.File
}

func NewFile(path string) (*File, error) {
    f, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        return nil, err
    }
    return &File{
        mtx:  &sync.Mutex{},
        file: f,
    }, nil
}

func (f *File) Write(data []byte, offset int64) error {
    f.mtx.Lock()
    defer f.mtx.Unlock()

    if _, err := f.file.Seek(offset, os.SEEK_SET); err != nil {
        return err
    }
    if _, err := f.file.Write(data); err != nil {
        return err
    }
    return nil
}

在优化版本中:

  • 我们创建了一个File结构,其中包含一个互斥量和一个文件指针。
  • Writerrreee
  • Dans cet exemple, l'intégralité du fichier est protégé par un verrou global, même si seules certaines données doivent être écrites.
  • Version optimisée :
rrreee

Dans la version optimisée :

    Nous créons une structure Fichier qui contient un mutex et un pointeur de fichier.

    La fonction Write est spécialement utilisée pour écrire des données au décalage spécifié.

    🎜Nous verrouillons le mutex uniquement lorsque nous avons besoin d'écrire des données, avec une granularité plus fine. 🎜🎜🎜🎜Conclusion🎜🎜🎜En optimisant la granularité des verrouillages, nous pouvons améliorer les performances des fonctions simultanées et réduire les conflits de verrouillage. En utilisant des verrous à granularité fine, une séparation en lecture-écriture et des structures de données sans verrou, nous pouvons créer un code concurrent plus évolutif et plus efficace. 🎜

    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