Maison > développement back-end > Golang > Comment les fonctions Golang communiquent avec goroutine

Comment les fonctions Golang communiquent avec goroutine

PHPz
Libérer: 2024-04-26 09:36:02
original
963 Les gens l'ont consulté

Les fonctions et les Goroutines peuvent communiquer des manières suivantes : Verrouillage mutex : utilisé pour protéger les ressources partagées Variable de condition : utilisée pour notifier Goroutine qui remplit la condition Canal : tampon de transfert de données Variable atomique : variable d'accès simultané sans verrouillage Cas pratique : traitement parallèle Tâches utilisez Goroutine pour améliorer l'efficacité d'exécution des tâches gourmandes en calcul, qui comprend trois étapes : création de tâches, démarrage des tâches de traitement Goroutine et collecte des résultats de traitement.

Comment les fonctions Golang communiquent avec goroutine

La méthode de communication entre les fonctions et les Goroutines en langage Go

En langage Go, les fonctions et les Goroutines peuvent communiquer des manières suivantes :

1. Mutex (Mutex)

Les verrous Mutex sont utilisés pour protégez les ressources partagées et assurez-vous qu’un seul Goroutine peut accéder à la ressource en même temps.

var mu sync.Mutex // 全局互斥锁

func increment(i *int) {
    mu.Lock()
    *i++
    mu.Unlock()
}
Copier après la connexion

2. Variable de condition (Cond)

La variable de condition est utilisée pour avertir le Goroutine en attente lorsque la condition spécifiée est remplie.

var cond sync.Cond // 全局条件变量

func wait(c *sync.Cond, i *int) {
    c.L.Lock()
    for {
        if *i == 0 {
            c.Wait()
        }
        break
    }
    c.L.Unlock()
}
Copier après la connexion

3. Canal

Un canal est un tampon utilisé pour envoyer des données entre Goroutines.

var ch = make(chan int, 10) // 创建容量为 10 的通道

func send(c chan int, i int) {
    c <- i // 发送数据
}

func receive(c chan int) {
    v := <-c // 接收数据
}
Copier après la connexion

4. Variables atomiques

Les variables atomiques sont accessibles simultanément sans verrous.

var atomicInt int64

func incrementAtomic(i *int64) {
    atomicInt++
}
Copier après la connexion

Cas pratique : tâches de traitement parallèles

Ce qui suit est un cas pratique d'utilisation de Goroutine pour traiter des tâches en parallèle :

// 任务类型
type Task struct {
    Num  int
    Chan chan int
}

func processTask(t *Task) {
    // 处理任务并返回结果
    result := t.Num * t.Num
    t.Chan <- result
}

func createTasks(n int) []*Task {
    // 创建 n 个任务
    tasks := make([]*Task, n)
    for i := 0; i < n; i++ {
        tasks[i] = &Task{
            Num:  i,
            Chan: make(chan int),
        }
    }
    return tasks
}

func main() {
    n := 10
    tasks := createTasks(n)

    // 启动 n 个 Goroutine 并行处理任务
    for _, t := range tasks {
        go processTask(t)
    }

    // 从任务中收集处理结果
    results := make([]int, n)
    for i := 0; i < n; i++ {
        results[i] = <-tasks[i].Chan
    }

    // 打印结果
    for _, r := range results {
        fmt.Println(r)
    }
}
Copier après la connexion

Utiliser Goroutine pour traiter des tâches en parallèle peut améliorer considérablement l'efficacité d'exécution du programme, en particulier pour tâches à forte intensité de calcul.

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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal