diff --git a/concurrency/channel.go b/concurrency/channel.go index 58bffdf..a7ccfe3 100644 --- a/concurrency/channel.go +++ b/concurrency/channel.go @@ -203,12 +203,17 @@ func (c *Channel) Or(channels ...<-chan any) <-chan any { case <-channels[1]: } default: + m := len(channels) / 2 select { - case <-channels[0]: - case <-channels[1]: - case <-channels[2]: - case <-c.Or(append(channels[3:], orDone)...): + case <-c.Or(channels[:m]...): + case <-c.Or(channels[m:]...): } + // select { + // case <-channels[0]: + // case <-channels[1]: + // case <-channels[2]: + // case <-c.Or(append(channels[3:], orDone)...): + // } } }() diff --git a/concurrency/channel_test.go b/concurrency/channel_test.go index 26616ed..f2b6834 100644 --- a/concurrency/channel_test.go +++ b/concurrency/channel_test.go @@ -125,7 +125,13 @@ func TestOr(t *testing.T) { start := time.Now() c := NewChannel() - <-c.Or(sig(2*time.Hour), sig(5*time.Minute), sig(1*time.Second), sig(1*time.Hour), sig(1*time.Minute)) + <-c.Or( + sig(1*time.Second), + sig(2*time.Second), + sig(3*time.Second), + sig(4*time.Second), + sig(5*time.Second), + ) t.Logf("done after %v", time.Since(start))