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é 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
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
结构,其中包含一个互斥量和一个文件指针。Write
rrreeeDans 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é.
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!