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.
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!