您的位置:首页 > 编程语言 > Go语言

go 任务队列执行超时

2017-11-29 10:09 169 查看
go的channel顾名思义是通道,并且是阻塞的 ,也可以当作阻塞队列使用

ch :=make(chan int)

ch<-1 如果不从ch中获取那么就一只阻塞在这里。

channel 也可以扩容 make(chan int,100)。

也是给这个队列加上超时

package main

import (
"fmt"
"sync"
"time"
)
var jobChan chan int
var wg sync.WaitGroup

// 执行任务
func worker(jobChan <- chan int) {
defer wg.Done()
for job := range jobChan {
fmt.Printf("%d \n",job)
}
}

func main() {
jobChan = make(chan int,100)
for i := 1;i <10;i++ {
jobChan <-i
}
wg.Add(1)
close(jobChan)
go worker(jobChan)
//wg.Wait()
res := WaitTimeout(&wg, 5*time.Second)
if res {
fmt.Println("执行完成退出")
} else {
fmt.Println("执行超时退出")
}
}

//利用select实现超时机制,select是只要case完成就继续往下走
func WaitTimeout(wg *sync.WaitGroup, timeout time.Duration) bool {
ch := make(chan struct{})
go func() {
wg.Wait()
close(ch)
}()
select { // 使用select必须是面向channel IO操作
case <-ch:
return true
case <-time.After(timeout):
return false
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: