Maison > développement back-end > Golang > 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
Libérer: 2024-06-01 12:14:56
original
768 Les gens l'ont consulté

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)
}
Copier après la connexion

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
Copier après la connexion

Recevoir des données depuis le pipe :

val := <-ch
Copier après la connexion

Cas pratique : lecture de fichiers

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

Hello
World
Copier après la connexion
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)
    }
}
Copier après la connexion

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!

É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