我想做一个动态通道池,它可以监听数十万个通道,所有这些都在控制之下,正如我所排除的那样,我希望它能够自动升级,如果有太多的通道监听(goroutine =>反射=>选择)但是在selectN通道观察器编码期间,我被通道替换阻止了
我想在运行时替换chan,这是在选择循环中,我已经尝试了一段时间以使其可用,但事情进展不顺利。
func Test_Change(t *testing.T) {
type A struct {
ch chan interface{}
}
a := &A{
ch: make(chan interface{}),
}
go func() {
for {
select {
case v := <-a.ch:
fmt.Println(v)
}
}
}()
newCh := make(chan interface{})
go func() {
for i := 0; i < 200; i++ {
a.ch <- i
}
a.ch = newCh
}()
go func() {
for i := 1000; i < 1010; i++ {
newCh <- i
}
}()
for {
select {}
}}
它阻止了
func Test_Change(t *testing.T) {
type A struct {
ch chan interface{}
bh chan interface{}
}
a := &A{
ch: make(chan interface{}),
bh: make(chan interface{}),
}
notify := make(chan struct{})
go func() {
for {
select {
case v := <-a.ch:
fmt.Println(v)
case <-notify:
fmt.Println("notify")
}
}
}()
newCh := make(chan interface{})
go func() {
for i := 0; i < 200; i++ {
a.ch <- i
}
a.ch = newCh
notify <- struct{}{}
}()
go func() {
for i := 1000; i < 1010; i++ {
newCh <- i
}
}()
for {
select {}
}}
它奏效了
慕斯709654
潇湘沐
炎炎设计
相关分类