【发布时间】:2015-09-16 05:30:42
【问题描述】:
我在 Python 中有这个方便的函数:
def follow(path):
with open(self.path) as lines:
lines.seek(0, 2) # seek to EOF
while True:
line = lines.readline()
if not line:
time.sleep(0.1)
continue
yield line
它做一些类似于 UNIX tail -f 的事情:你会得到文件的最后几行。这很方便,因为您可以在不阻塞的情况下获取生成器并将其传递给另一个函数。
然后我不得不在 Go 中做同样的事情。我是这门语言的新手,所以我不确定我所做的对于 Go 来说是否足够地道/正确。
代码如下:
func Follow(fileName string) chan string {
out_chan := make(chan string)
file, err := os.Open(fileName)
if err != nil {
log.Fatal(err)
}
file.Seek(0, os.SEEK_END)
bf := bufio.NewReader(file)
go func() {
for {
line, _, _ := bf.ReadLine()
if len(line) == 0 {
time.Sleep(10 * time.Millisecond)
} else {
out_chan <- string(line)
}
}
defer file.Close()
close(out_chan)
}()
return out_chan
}
在 Go 中有没有更简洁的方法来做到这一点?我有一种感觉,对这样的事情使用异步调用有点过头了,这真的让我很困扰。
【问题讨论】:
-
使用
os.SEEK_END而不是2。time.Sleep(10)睡眠 10 纳秒,你可能是指time.Sleep(10 * time.Millisecond)。一旦io.Reader给你io.EOF,你就不应该期望它会给你更多数据; EOF == 结束文件/steam,没有更多数据了。 -
谢谢,我编辑了代码。