golang 多线程读取同一个文件,发送并合成一个文件
时间: 2023-11-26 15:01:10 浏览: 47
golang有很多支持多线程读取文件的方式,我将介绍一种常见的方法。
首先,我们需要创建一个用于读取的goroutine,该goroutine负责从文件中读取数据,并将读取到的数据发送到一个通道中。在主函数中,我们可以启动多个读取goroutine,并通过通道将它们读取的数据收集起来。
伪代码如下:
```go
package main
import (
"bufio"
"fmt"
"io"
"os"
"sync"
)
func readFile(filePath string, output chan<- []byte, wg *sync.WaitGroup) {
defer wg.Done()
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("Failed to open file: %s\n", err)
return
}
defer file.Close()
reader := bufio.NewReader(file)
for {
line, _, err := reader.ReadLine()
if err != nil && err != io.EOF {
fmt.Printf("Failed to read file: %s\n", err)
return
}
if err == io.EOF {
break
}
output <- line
}
}
func main() {
const numWorkers = 4 // 启动4个goroutine来读取文件
inputFilePath := "input.txt" // 输入文件路径
outputFilePath := "output.txt" // 输出文件路径
input, err := os.Open(inputFilePath)
if err != nil {
fmt.Printf("Failed to open input file: %s\n", err)
return
}
defer input.Close()
output, err := os.Create(outputFilePath)
if err != nil {
fmt.Printf("Failed to create output file: %s\n", err)
return
}
defer output.Close()
wg := &sync.WaitGroup{}
wg.Add(numWorkers)
// 创建通道,用于接收每个goroutine读取的数据
data := make(chan []byte)
// 启动goroutine读取文件
for i := 0; i < numWorkers; i++ {
go readFile(inputFilePath, data, wg)
}
// 合并数据并写入输出文件
go func() {
for d := range data {
_, err := output.Write(d)
if err != nil {
fmt.Printf("Failed to write to output file: %s\n", err)
return
}
}
}()
wg.Wait()
close(data)
}
```
上述代码中,我们创建了一个通道`data`来接收每个goroutine读取的数据。通过启动多个读取goroutine,它们将并发读取文件的不同部分,并将读取到的数据发送到`data`通道中。最后,我们启动了一个goroutine来接收`data`通道中的数据,并将其写入输出文件。通过这种方式,并发读取和写入文件,从而实现了多线程读取同一个文件并合成一个文件的需求。
在实际应用中,你可以根据自己的需求和文件的特性进行调整,比如指定读取文件的起始和结束位置,或者调整启动的读取goroutine的数量等。