从通道中读取数据并间隔打印
Read data from channel and print it at interval
假设我们有(删除)goroutine,它删除了一些文件并通过通道将删除的文件计数(计数器)发送到(主)。
示例:
func main() {
filesList := []string{"file1", "file2", "file3", "file4"}
channelStream := make(chan int)
go func(files []string, channel chan<- int) {
defer close(channel)
counter := 0
for _, file := range files {
err := os.Remove(file)
if err != nil {
log.Fatal(err)
}
counter += 1
channel <- counter
}
}(filesList, channelStream)
for msg := range channelStream { //Read from channel until it is closed
fmt.Printf("\r--> " + strconv.Itoa(msg) + " files removed")
}
}
现在,每删除一个文件,(counter)就会被发送到(main),在那里打印到终端,即大量打印。
我的问题是:如何按时间间隔(比如说每 1 秒)打印(计数器)?
谢谢,
一个常见的选项是缓冲输出并定期刷新它,这将允许累积所有不同类型的输出:
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
tick := time.NewTicker(time.Second)
defer tick.Stop()
for {
select {
case msg, ok := <-channelStream:
if !ok {
return
}
fmt.Fprintf(out, "--> %d files removed\n", msg)
case <-tick.C:
out.Flush()
}
}
但是,由于您似乎只是在此处跟踪和更新计数器值,所以我只更新计数器本身并在每个时间间隔将其写出:
tick := time.NewTicker(time.Second)
defer tick.Stop()
var counter int
var ok bool
for {
select {
case msg, ok := <-channelStream:
if !ok {
fmt.Printf("\r--> %d files removed", counter)
return
}
counter += msg
case <-tick.C:
fmt.Printf("\r--> %d files removed", counter)
}
}
假设我们有(删除)goroutine,它删除了一些文件并通过通道将删除的文件计数(计数器)发送到(主)。
示例:
func main() {
filesList := []string{"file1", "file2", "file3", "file4"}
channelStream := make(chan int)
go func(files []string, channel chan<- int) {
defer close(channel)
counter := 0
for _, file := range files {
err := os.Remove(file)
if err != nil {
log.Fatal(err)
}
counter += 1
channel <- counter
}
}(filesList, channelStream)
for msg := range channelStream { //Read from channel until it is closed
fmt.Printf("\r--> " + strconv.Itoa(msg) + " files removed")
}
}
现在,每删除一个文件,(counter)就会被发送到(main),在那里打印到终端,即大量打印。
我的问题是:如何按时间间隔(比如说每 1 秒)打印(计数器)?
谢谢,
一个常见的选项是缓冲输出并定期刷新它,这将允许累积所有不同类型的输出:
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
tick := time.NewTicker(time.Second)
defer tick.Stop()
for {
select {
case msg, ok := <-channelStream:
if !ok {
return
}
fmt.Fprintf(out, "--> %d files removed\n", msg)
case <-tick.C:
out.Flush()
}
}
但是,由于您似乎只是在此处跟踪和更新计数器值,所以我只更新计数器本身并在每个时间间隔将其写出:
tick := time.NewTicker(time.Second)
defer tick.Stop()
var counter int
var ok bool
for {
select {
case msg, ok := <-channelStream:
if !ok {
fmt.Printf("\r--> %d files removed", counter)
return
}
counter += msg
case <-tick.C:
fmt.Printf("\r--> %d files removed", counter)
}
}