Golang实现Time定时器超时退出方式

1. time.After

假设业务中需调用服务接口A,要求超时时间为5秒,那么如何优雅、简洁的实现呢?

可以采用select+time.After的方式,十分简单适用的实现。

package main

import (
	"fmt"
	"time"
)

//发送者
func sender(c chan int) {
	for i := 0; i < 20; i++ {
		c <- i
		if i >= 5 {
			time.Sleep(time.Second * 7)
		} else {
			time.Sleep(time.Second)
		}
	}
}

func main() {
	c := make(chan int)
	go sender(c)
	timeout := time.After(time.Second * 3)
	for {
		select {
		case d := <-c:
			fmt.Println(d)
		case <-timeout:
			fmt.Println("执行定时操作任务")
		case dd := <-time.After(time.Second * 3):
			fmt.Println(dd.Format("2006-01-02 15:04:05"), "执行超时动作")
		}
		fmt.Println("for end")
	}
}

2. time.NewTimer

NewTimer 创建一个 Timer,它会在最少过去时间段 d 后到期,向其自身的 C 字段发送当时的时间

 t.Reset()需要重置Reset 使 t 重新开始计时

package main

import (
	"fmt"
	"time"
)

func main() {
	t := time.NewTimer(time.Second * 2)
	ch := make(chan bool)
	go func(t *time.Timer) {
		defer t.Stop()
		for {
			select {
			case <-t.C:
				fmt.Println("timer running....")
				// 需要重置Reset 使 t 重新开始计时
				t.Reset(time.Second * 2)
			case stop := <-ch:
				if stop {
					fmt.Println("timer Stop")
					return
				}
			}
		}
	}(t)
	time.Sleep(10 * time.Second)
	ch <- true
	close(ch)
	time.Sleep(1 * time.Second)
}

3. time.NewTicker

NewTicker 返回一个新的 Ticker,该 Ticker 包含一个通道字段,并会每隔时间段 d 就向该通道发送当时的时间。它会调整时间间隔或者丢弃 tick 信息以适应反应慢的接收者。如果d <= 0会触发panic。

ticker.Stop()关闭该 Ticker 可以释放相关资源。

package main

import (
	"fmt"
	"time"
)

func main() {
	ticker := time.NewTicker(2 * time.Second) // 新建一个Ticker
	ch := make(chan bool)
	go func(ticker *time.Ticker) {
		defer ticker.Stop() // 停止Ticker
		for {
			select {
			case <-ticker.C: // Ticker.C 的封装
				fmt.Println("Ticker running...")
			case stop := <-ch:
				if stop {
					fmt.Println("Ticker Stop")
					return
				}
			}
		}
	}(ticker)
	time.Sleep(10 * time.Second)
	ch <- true
	close(ch)
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 asynq 中,可以通过设置超时时间来控制任务的处理时间。如果任务的处理时间超过了设置的超时时间,asynq 会将任务标记为失败并将其重新排队。 如果你想要在任务存在时间超时时将其标记为失败并重新排队,你可以使用 asynq 的定时任务功能。你可以为每个任务设置一个超时时间,在超时时间到达后,asynq 会将任务标记为失败并将其重新排队。 以下是一个示例代码,演示了如何在 golang实现 asynq 任务的超时处理: ```go import ( "github.com/hibiken/asynq" "time" ) func main() { // 初始化 asynq 客户端 client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) // 定义任务 task := asynq.NewTask("my-task", nil) // 设置任务的最大处理时间为 10 秒 task.Timeout = 10 * time.Second // 将任务发送到 asynq _, err := client.Enqueue(task) if err != nil { // 处理错误 } } ``` 在上面的示例中,我们将任务的超时时间设置为 10 秒。如果任务的处理时间超过了 10 秒,asynq 会将任务标记为失败并将其重新排队。 如果你想要设置任务存在时间超时,你可以使用 asynq 的定时任务功能。以下是一个示例代码,演示了如何在 golang实现 asynq 任务的存在时间超时处理: ```go import ( "github.com/hibiken/asynq" "time" ) func main() { // 初始化 asynq 客户端 client := asynq.NewClient(asynq.RedisClientOpt{Addr: "localhost:6379"}) // 定义任务 task := asynq.NewTask("my-task", nil) // 设置任务的存在时间为 1 小时 task.TTL = 1 * time.Hour // 将任务发送到 asynq _, err := client.Enqueue(task) if err != nil { // 处理错误 } } ``` 在上面的示例中,我们将任务的存在时间设置为 1 小时。如果任务在 1 小时内没有被处理,asynq 会将其标记为失败并将其重新排队。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值