From c27ccad2b967e71487f659ab67d13b20c6231629 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Thu, 21 Apr 2022 14:13:19 +0800 Subject: [PATCH] refactor: refact Or func in channel.go --- concurrency/channel.go | 13 +++++++++---- concurrency/channel_test.go | 8 +++++++- 2 files changed, 16 insertions(+), 5 deletions(-) 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))