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  }