假设我们有多个通知源(频道),我们希望对其中一些通知事件执行一些类似的任务。例如,考虑我们每10分钟调用doSomething()
的情况以及用户请求的情况。 Go中可能的实现可能是这样的:
var ticker = time.NewTicker(10*time.Minute)
nowDoSomething := make(chan time.Time, 1)
for {
select {
case <-ticker.C:
nowDoSomething<-time.Now()
case <-userReq: // some channel activated occasionally
nowDoSomething<-time.Now()
case <-nowDoSomething:
doSomething()
}
}
实现类似功能的其他方式,或许更好的方法是什么?
答案 0 :(得分:0)
也许您可以使用反射包中的Select函数来执行此操作:
func Select(cases [] SelectCase)(选择int,recv Value,recvOK bool)
答案 1 :(得分:-2)
如果您可以调用doSomething(),为什么要使用频道向自己发信号?我理解做某事可能不是一个功能,但你总是可以使用本地闭包。
参见一个工作示例:
package main
import (
"fmt"
"time"
)
func someRoutine (userReq chan int) {
doSomething := func () {
fmt.Printf ("OK %v\n", time.Now())
}
var ticker = time.NewTicker(10*time.Second)
for {
select {
case <-ticker.C:
doSomething()
case <-userReq: // some channel activated occasionally
doSomething()
}
}
}
func main() {
userReq := make(chan int, 1)
go someRoutine(userReq);
userReq <- 1 // user requested some action here (just to mark the start)
time.Sleep(15*time.Second)
userReq <- 1 // user requested some action here
time.Sleep(30*time.Second)// Put your own waiting and exiting logic here
}
如果你仍然想要优化它超出这个简单的修正,总会有一些替代方案。但只需要读取两个通道,请确保您没有进行过早优化。