Maison  >  Article  >  développement back-end  >  Comment lire et écrire des fichiers simultanément dans Golang ?

Comment lire et écrire des fichiers simultanément dans Golang ?

PHPz
PHPzoriginal
2024-06-05 18:12:001158parcourir

Lecture simultanée de fichiers : créez une goroutine pour lire les blocs de données simultanément et utilisez la coordination de la communication par pipeline ; Écriture simultanée de fichiers : utilisez la goroutine pour écrire des données et utilisez un mutex pour protéger l'opération d'écriture.

如何在 Golang 中并发读取和写入文件?

Comment lire et écrire des fichiers simultanément dans Golang ?

Le traitement simultané des E/S de fichiers est une technique courante pour améliorer les performances des programmes Golang. Avec un accès simultané, nous pouvons lire et écrire des données simultanément, plutôt que d'attendre la fin d'une opération avant d'en commencer une autre. Cet article montrera comment utiliser goroutine pour lire et écrire des fichiers simultanément dans Golang.

Lecture simultanée

Afin de lire des fichiers simultanément, nous pouvons créer plusieurs goroutines, chaque goroutine lit les blocs de données du fichier. Pour coordonner ces goroutines, nous utiliserons des tuyaux pour communiquer.

package main

import (
    "bufio"
    "os"
    "fmt"
    "sync"
    "time"
)

func readFile(filePath string, wg *sync.WaitGroup, ch chan<- string) {
    defer wg.Done()
    file, err := os.Open(filePath)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()

    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        ch <- scanner.Text()
    }
}

func main() {
    // 创建一个容量为 10 的管道
    ch := make(chan string, 10)

    // 等待组用于跟踪 goroutine
    var wg sync.WaitGroup

    filePath := "filename.txt"
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go readFile(filePath, &wg, ch)
    }

    // 从管道中读取数据,并停止管道以等待所有 goroutine 完成
    go func() {
        wg.Wait()
        close(ch)
    }()

    for data := range ch {
        fmt.Println(data)
    }

    // 等待管道数据完全输出
    time.Sleep(1 * time.Second)
}

Écriture simultanée

Pour l'écriture simultanée dans des fichiers, nous utilisons une approche similaire mais utilisons des goroutines pour écrire les données et un mutex pour garantir un accès exclusif aux opérations d'écriture.

package main

import (
    "os"
    "fmt"
    "sync"
)

func writeFile(filePath string, wg *sync.WaitGroup, data <-chan string) {
    defer wg.Done()

    // 使用互斥锁保护文件写入
    lock := new(sync.Mutex)

    file, err := os.OpenFile(filePath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()

    for dataString := range data {
        lock.Lock()
        _, err = file.WriteString(dataString + "\n")
        if err != nil {
            fmt.Println(err)
            continue
        }
        lock.Unlock()
    }
}

func main() {
    // 创建一个容量为 10 的管道
    ch := make(chan string, 10)

    // 等待组用于跟踪 goroutine
    var wg sync.WaitGroup

    filePath := "filename.txt"
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go writeFile(filePath, &wg, ch)
    }

    // 向管道写入数据,并停止管道以等待所有 goroutine 完成
    go func() {
        for i := 0; i < 100; i++ {
            ch <- fmt.Sprintf("Data point %d\n", i)
        }
        close(ch)
    }()

    wg.Wait()
}

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