你有一些选项视乎你的实际使用情况:
1-使用两个够程:
这需要sync/Lock
:
试试这个模拟样品(The Go Playground):
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
time.AfterFunc(time.Duration(rand.Intn(1000))*time.Millisecond, func() { ES <- 101 })
time.AfterFunc(time.Duration(rand.Intn(1000))*time.Millisecond, func() { REDIS <- 102 })
go B()
go C()
data := <-channel
fmt.Println(data)
}
func B() {
check := true
data := 0
for {
select {
case <-quit:
return
case data = <-ES: // receive data
}
if check {
mx.Lock()
//defer mx.Unlock()
if mx.done {
mx.Unlock()
return
}
check = false
close(quit)
mx.done = true
mx.Unlock()
}
fmt.Println("ES ready")
channel <- data
}
}
func C() {
check := true
data := 0
for {
select {
case <-quit:
return
case data = <-REDIS: // receive data
}
if check {
mx.Lock()
//defer mx.Unlock()
if mx.done {
mx.Unlock()
return
}
check = false
close(quit)
mx.done = true
mx.Unlock()
}
fmt.Println("REDIS ready")
channel <- data
}
}
var (
channel = make(chan int)
ES = make(chan int)
REDIS = make(chan int)
quit = make(chan struct{})
mx lockdown
)
type lockdown struct {
sync.Mutex
done bool
}
2-在此示例中,您只需启动一个常规B
或C
:
看到这样的伪代码:
func main() {
go A()
data := <-channel
fmt.Println(data)
}
func A() {
for{
if ES ready
go B(data)
return
if REDIS ready
go C(data)
return
}
}
你可能开始A
够程,在A
的goroutine它可以检测输入就绪如ES
或REDIS
,然后开始B
或C
够程相应:
试试这个模拟样品(The Go Playground):
AfterFunc仅仅是模拟,真正的代码,你不需要它,它模拟了随机时间为一个输入。从试验1
输出
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix())
time.AfterFunc(time.Duration(rand.Intn(1000))*time.Millisecond, func() { ES <- 101 })
time.AfterFunc(time.Duration(rand.Intn(1000))*time.Millisecond, func() { REDIS <- 102 })
go A()
data := <-channel
fmt.Println(data)
}
func A() {
select {
case data := <-ES:
go B(data)
return
case data := <-REDIS:
go C(data)
return
}
}
func B(data int) {
for {
fmt.Println("ES ready")
channel <- data
data = <-ES
}
}
func C(data int) {
for {
fmt.Println("REDIS ready")
channel <- data
data = <-REDIS
}
}
var (
channel = make(chan int)
ES = make(chan int)
REDIS = make(chan int)
)
:
REDIS ready
102
从运行2输出:
ES ready
101
没有看到代码为每个请求,这更可能是他们没有使用任何CPU ,并正在网络上等待。你打算如何取消这些? – JimB
@JimB没有想法的哥们,这就是为什么我的问题在那里,介意如果我添加您的评论的问题?因为它描述了我的问题的一部分...... –
这更多的是一个修辞问题,因为实际上这样做可能并不可行,需要甚至更有效率。这也取决于服务器(我不认为其中任何一个提供API来取消正在进行的请求),并且客户端库(有一个强制连接关闭的有用钩子)。 – JimB