time.NewTicker
时间: 2024-05-15 15:14:15 浏览: 107
`time.NewTicker` 是 Golang 中的一个函数,它会返回一个 `time.Ticker` 类型的值,用于定期触发一个事件。`time.Ticker` 会在指定的时间间隔内重复执行。
下面是一个例子,每隔一秒钟输出一次当前时间:
```
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for range ticker.C {
fmt.Println(time.Now())
}
}
```
在上面的代码中,我们通过 `time.NewTicker` 创建了一个时间间隔为 1 秒的 `time.Ticker` 对象,然后使用 `for range` 循环来监听 `ticker.C` 的值,每当 `ticker.C` 中有时间到达时,就会执行一次循环体中的代码,输出当前时间。最后使用 `defer` 关键字来确保 `ticker` 被停止。
相关问题
func randomChain() chan interface{} { data := Data{0} nc := make(chan interface{},4096) count := int64(0) go func() { ticker := time.NewTicker(1 * time.Second) for { select { case <-ticker.C: fmt.Println("Per second: ", count, len(nc)) count = 0 default: nc <- &data count++ } } }() go func() { ticker := time.NewTicker(1 * time.Second) for { select { case <-ticker.C: fmt.Println("Per second: ", count, len(nc)) count = 0 default: nc <- &data count++ } } }() // 在程序退出时打印管道中的剩余数据数量 c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c fmt.Println("Remaining data count:", len(nc)) os.Exit(1) }() return nc } 优化
这段代码中存在两个重复的 goroutine,它们的代码实现是完全一样的,可以将它们合并成一个。另外,可以将计数器和 ticker 的定义提到外部函数中,避免重复定义。最后,在程序退出时,可以直接使用 defer 关键字来打印管道中的剩余数据数量,避免使用 signal 包。
下面是优化后的代码:
```
func randomChain() chan interface{} {
data := Data{0}
nc := make(chan interface{}, 4096)
count := int64(0)
ticker := time.NewTicker(1 * time.Second)
go func() {
for {
select {
case <-ticker.C:
fmt.Println("Per second: ", count, len(nc))
count = 0
default:
nc <- &data
count++
}
}
}()
// 在程序退出时打印管道中的剩余数据数量
defer func() {
fmt.Println("Remaining data count:", len(nc))
}()
return nc
}
```
func randomChain() chan interface{} { // 1 避免丢失数据 data := Data{0} nc := make(chan interface{}) count := int64(0) go func() { ticker := time.NewTicker(1 * time.Second) for { select { case <-ticker.C: fmt.Println(count) count = 0 default: nc <- &data count++ } } }() return nc } 当chan堵塞是打印提示
可以在default分支中加入一个超时机制,如果超过一定时间nc仍然没有被读取,则可以认为nc发生了堵塞情况,此时打印提示信息。例如,可以在default分支中再嵌套一个select语句,监听nc是否被读取,如果超过一定时间nc仍未被读取,则打印提示信息。代码如下:
```
go func() {
ticker := time.NewTicker(1 * time.Second)
for {
select {
case <-ticker.C:
fmt.Println(count)
count = 0
default:
select {
case nc <- &data:
count++
case <-time.After(100 * time.Millisecond):
fmt.Println("chan is blocked")
}
}
}
}()
```
这里使用了time.After函数来创建一个超时的channel,如果在100毫秒内nc仍未被读取,则会从After函数返回的channel中读取到数据,从而触发打印提示信息。需要注意的是,这里的超时时间100毫秒应该根据实际情况进行调整。
阅读全文