Maison  >  Article  >  développement back-end  >  Comment utiliser des tuyaux dans Go pour des E/S non bloquantes ?

Comment utiliser des tuyaux dans Go pour des E/S non bloquantes ?

WBOY
WBOYoriginal
2024-06-01 12:14:56682parcourir

Des E/S non bloquantes dans le langage Go peuvent être obtenues en utilisant des tubes : Créez un tube sans tampon : make(chan int) Envoyez des données au tube : ch <- 1 Recevez des données du tube : val := < -ch Cas pratique : Créer un programme de lecture de fichiers non bloquant

如何使用 Go 语言中的管道进行非阻塞 I/O?

Comment utiliser les pipes en langage Go pour des E/S non bloquantes ?

Les tuyaux sont un moyen efficace de communiquer dans des programmes Go simultanés. Ils permettent un code basé sur des événements, dans lequel chaque étape s'exécute indépendamment tandis que les données circulent de manière asynchrone dans le pipeline. Cet article montrera comment utiliser les canaux pour implémenter des E/S non bloquantes dans le langage Go.

Création et utilisation de pipes

Créer une pipe est très simple : une pipe non tamponnée de type

package main

import "fmt"

func main() {
    ch := make(chan int)
}

make(chan int) 创建一个可以容纳 int. L'absence de tampon signifie que les données sont transférées immédiatement d'une coroutine à une autre, ce qui est essentiel pour les applications d'E/S hautes performances.

Envoyer des données vers le pipe :

ch <- 1

Recevoir des données depuis le pipe :

val := <-ch

Cas pratique : lecture de fichiers

Créons un programme de lecture de fichiers non bloquant. Supposons que le contenu du fichier soit :

Hello
World
package main

import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    ch := make(chan string)

    file, err := os.Open("file.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()

    go func() {
        scanner := bufio.NewScanner(file)
        for scanner.Scan() {
            ch <- scanner.Text()
        }
        ch <- "" // 标记文件读完
    }()

    // 从管道中以非阻塞方式读取行
    for {
        line := <-ch
        if line == "" {
            break
        }
        fmt.Println(line)
    }
}

Le programme crée un canal pour transférer les lignes du fichier. Une coroutine est responsable de la lecture du fichier et de l'envoi des lignes au tube. La coroutine principale reçoit alors les lignes du tube, et comme le tube n'est pas bloquant, elle peut continuer à effectuer d'autres tâches même si la lecture du fichier n'est pas terminée.

Lorsque la lecture du fichier est terminée, envoyez une ligne vide pour notifier à la coroutine principale de quitter la boucle.

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