github.com/Mericusta/go-stp@v0.6.8/queue_test.go (about) 1 package stp 2 3 import ( 4 "fmt" 5 "sync" 6 "testing" 7 "time" 8 ) 9 10 func Test_PoolDequeue(t *testing.T) { 11 var ( 12 wg = &sync.WaitGroup{} 13 producerCount = 1 << 16 14 produceCount = 1 15 consumerCount = 1 16 p = NewPoolDequeue(producerCount * produceCount) 17 producer = func(wg *sync.WaitGroup, p PoolDequeue, v any) { 18 if produceCount > 1 { 19 for i := 0; i < produceCount; i++ { 20 p.PushHead(i) 21 } 22 } else { 23 p.PushHead(v) 24 } 25 wg.Done() 26 // fmt.Printf("producer %v done\n", v) 27 } 28 consumer = func(wg *sync.WaitGroup, p PoolDequeue) { 29 i := 0 30 for i < producerCount { 31 v, ok := p.PopTail() 32 if !ok { 33 time.Sleep(time.Millisecond) 34 fmt.Printf("consumer continue at %v\n", i) 35 continue 36 } 37 fmt.Printf("consumer receive value %v, i = %v\n", v, i) 38 if v == nil { 39 fmt.Printf("consumer receive nil value at %v\n", i) 40 continue 41 } 42 i++ 43 if i == producerCount*2 { 44 panic("overload") 45 } 46 } 47 fmt.Printf("consumer done\n") 48 wg.Done() 49 } 50 ) 51 52 wg.Add(producerCount) 53 54 // producer 55 for i := 0; i < producerCount; i++ { 56 go producer(wg, p, i) 57 } 58 59 wg.Wait() 60 wg.Add(consumerCount) 61 62 // consumer 63 for i := 0; i < consumerCount; i++ { 64 go consumer(wg, p) 65 } 66 67 wg.Wait() 68 69 fmt.Printf("done\n") 70 }