Coder Social home page Coder Social logo

go-queue's People

Contributors

wukehong avatar yireyun avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

go-queue's Issues

Multi goroutines support?

One goroutine do puts and the other do gets, but gets nothing.
putPos increased then getPos always 0(zero)...

que.Get函数导致CPU到达100%

您好,我在阅读您的queue源码时,对func (q *EsQueue) Get() (val interface{}, ok bool, quantity uint32) 实现有一些疑惑,该函数通过for循环配合runtime.Gosched()来实现队列的阻塞访问,假设Get方法调用带一个空在queue队列上,同时程序没有运行其他的goroutine, 此时CPU的占用率依然很好,因为此时没有额外的goroutine在运行,runtime.Gosched的执行就变得没有意义,因为调度器只有这一个goroutine可以去调度,导致这个死循环一致在占用cpu,不知道这种情况下,队列该怎样设计才能在空队列的情况下,不会占用太多的cpu。

队列运行结果有点问题

源码:
`package main

import (
"fmt"
gq "github.com/yireyun/go-queue"
"time"
)

var q1 *gq.EsQueue

func init() {
q1 = gq.NewQueue(1024 * 1024 * 10)
}

func main() {
for i := 0; i < 100000; i++ {
ok, _ := q1.Put(fmt.Sprintf("%d,%s", i, time.Now().String()))
if !ok {
fmt.Println("写入", i, "出错")
return
}
}
fmt.Println("Quantity:", q1.Quantity())
time.Sleep(3 * time.Second)
for i := 0; i < 8; i++ {
go read(i)
}
time.Sleep(5 * time.Second)
}

func read(thread_id int) {
start := time.Now()
//fmt.Println("线程:", thread_id, "开始运行")
var count int64 = 0
for {
_, ok, a := q1.Get()
if !ok && a <= 0 {
//fmt.Println(thread_id, ",", "查询没有成功", ",", a)
break
} else {
count++
}
}
end := time.Now()
//fmt.Println("线程:", thread_id, "结束运行")
fmt.Println(fmt.Sprintf("线程:%d,操作:%d次,耗时:%d毫秒。", thread_id, count, end.Sub(start).Nanoseconds()/1000000))
}
结果:
Quantity: 100000
线程:0,操作:16517次,耗时:13毫秒。
线程:4,操作:12795次,耗时:13毫秒。
线程:6,操作:15669次,耗时:13毫秒。
线程:5,操作:12793次,耗时:13毫秒。
线程:7,操作:13619次,耗时:13毫秒。
线程:1,操作:13314次,耗时:13毫秒。
线程:2,操作:14963次,耗时:13毫秒。
线程:3,操作:12531次,耗时:13毫秒。
`

我的想法是,分多个线程从同一个队列中取数据,如果每个线程取到的数据加起来应该等于总数,可现在的结果是多了。

slow then the golang's chan

code:

func Benchmark_Queue(b *testing.B) {
	b.StopTimer()
	queue := NewQueue(40960)
	wg := &sync.WaitGroup{}
	var count uint32
	b.ResetTimer()
	b.StartTimer()
	wg.Add(20)
	for i := 0; i < 10; i++ {
		go func() {
			defer wg.Done()
			for j := 0; j < 100000; j++ {
				for {
					ok, _ := queue.Put(j)
					if ok {
						break
					}
				}
			}
		}()
		go func() {
			defer wg.Done()
			for {
				_, ok, _ := queue.Get()
				if ok {
					atomic.AddUint32(&count, 1)
				}
				if atomic.LoadUint32(&count) >= 1000000 {
					return
				}
			}
		}()
	}
	wg.Wait()
}
func Benchmark_Chan(b *testing.B) {
	b.StopTimer()
	ch := make(chan interface{}, 40960)
	wg := &sync.WaitGroup{}
	var count uint32
	b.ResetTimer()
	b.StartTimer()
	wg.Add(20)
	for i := 0; i < 10; i++ {
		go func() {
			defer wg.Done()
			for j := 0; j < 100000; j++ {
				ch <- j
			}
		}()
		go func() {
			defer wg.Done()
			for {
				<-ch
				if atomic.AddUint32(&count, 1) == 1000000 {
					close(ch)
				}
				if count >= 1000000 {
					return
				}
			}
		}()
	}
	wg.Wait()
}

result:

企业微信截图_1c2b61f3-52d0-4cc0-af22-a5cbdb06e164

CPU占用率太高

在队列为空的前提下,Get或者Put操作堵塞后cpu的占用率很高,我的配置下是在28%左右

测试了下 有部分会miss

环境

golang: 1.8.1

电脑: macbook pro 2015

go1.8.1, Grp:   1, Times:   10000000, miss:    22, use: 1.209557878s,    120ns/op
go1.8.1, Grp:   2, Times:   20000000, miss:     3, use: 2.856382642s,    142ns/op
go1.8.1, Grp:   3, Times:   30000000, miss:    16, use: 4.062569206s,    135ns/op
go1.8.1, Grp:   4, Times:   40000000, miss:    99, use: 5.468166346s,    136ns/op
go1.8.1, Grp:   5, Times:   50000000, miss:    68, use: 6.048150705s,    120ns/op
go1.8.1, Grp:   6, Times:   60000000, miss:   110, use: 7.528999734s,    125ns/op
go1.8.1, Grp:   7, Times:   70000000, miss:   131, use: 7.651929438s,    109ns/op
go1.8.1, Grp:   8, Times:   80000000, miss:   242, use: 10.124432821s,    126ns/op
go1.8.1, Grp: Sum, Times:  360000000, miss:     0, use: 44.95018877s,    124ns/op

这代码明显是有 race 的啊,而且测试跑挂了

go 1.9 beta 2

$ go test -race .
==================
WARNING: DATA RACE
Read at 0x00c4218c0068 by goroutine 16:
  github.com/yireyun/go-queue.(*EsQueue).Put()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:34 +0x86
  github.com/yireyun/go-queue.testQueuePutGet.func1()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:153 +0x257

Previous write at 0x00c4218c0068 by goroutine 15:
  sync/atomic.CompareAndSwapInt32()
      /home/cholerae/gopath/go/src/runtime/race_amd64.s:293 +0xb
  github.com/yireyun/go-queue.(*EsQueue).Put()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:48 +0xcb
  github.com/yireyun/go-queue.testQueuePutGet.func1()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:153 +0x257

Goroutine 16 (running) created at:
  github.com/yireyun/go-queue.testQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:149 +0x290
  github.com/yireyun/go-queue.TestQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:47 +0x9c
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 15 (running) created at:
  github.com/yireyun/go-queue.testQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:149 +0x290
  github.com/yireyun/go-queue.TestQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:47 +0x9c
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
==================
WARNING: DATA RACE
Read at 0x00c4218c006c by goroutine 18:
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:75 +0x86
  github.com/yireyun/go-queue.testQueuePutGet.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:167 +0x73

Previous write at 0x00c4218c006c by goroutine 17:
  sync/atomic.CompareAndSwapInt32()
      /home/cholerae/gopath/go/src/runtime/race_amd64.s:293 +0xb
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:89 +0xc6
  github.com/yireyun/go-queue.testQueuePutGet.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:167 +0x73

Goroutine 18 (running) created at:
  github.com/yireyun/go-queue.testQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:164 +0x389
  github.com/yireyun/go-queue.TestQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:47 +0x9c
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 17 (running) created at:
  github.com/yireyun/go-queue.testQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:164 +0x389
  github.com/yireyun/go-queue.TestQueuePutGet()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:47 +0x9c
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
--- FAIL: TestQueuePutGet (40.57s)
	esQueue_test.go:54: Grp: 16, Times: 1360000, use: 40.564807486s, 29.827µs/op
	esQueue_test.go:55: Put: 1360000, use: 25.132980623s, 18.48µs/op
	esQueue_test.go:56: Get: 1360000, use: 14.740623285s, 10.838µs/op
	testing.go:707: race detected during execution of test
==================
WARNING: DATA RACE
Read at 0x00c421c08028 by goroutine 56:
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:99 +0x148
  github.com/yireyun/go-queue.testQueueGeneral.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:213 +0xb1

Previous write at 0x00c421c08028 by goroutine 54:
  github.com/yireyun/go-queue.(*EsQueue).Put()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:60 +0x1af
  github.com/yireyun/go-queue.testQueueGeneral.func1()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:198 +0x257

Goroutine 56 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x345
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 54 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:194 +0x2b1
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
==================
WARNING: DATA RACE
Read at 0x00c421c08018 by goroutine 56:
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:100 +0x175
  github.com/yireyun/go-queue.testQueueGeneral.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:213 +0xb1

Previous write at 0x00c421c08018 by goroutine 54:
  github.com/yireyun/go-queue.(*EsQueue).Put()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:59 +0x172
  github.com/yireyun/go-queue.testQueueGeneral.func1()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:198 +0x257

Goroutine 56 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x345
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 54 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:194 +0x2b1
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
==================
WARNING: DATA RACE
Read at 0x00c421c08040 by goroutine 56:
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:99 +0x148
  github.com/yireyun/go-queue.testQueueGeneral.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:209 +0xf5

Previous write at 0x00c421c08040 by goroutine 54:
  github.com/yireyun/go-queue.(*EsQueue).Put()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:60 +0x1af
  github.com/yireyun/go-queue.testQueueGeneral.func1()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:198 +0x257

Goroutine 56 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x345
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 54 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:194 +0x2b1
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
==================
WARNING: DATA RACE
Read at 0x00c421c08030 by goroutine 56:
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:100 +0x175
  github.com/yireyun/go-queue.testQueueGeneral.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:209 +0xf5

Previous write at 0x00c421c08030 by goroutine 54:
  github.com/yireyun/go-queue.(*EsQueue).Put()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:59 +0x172
  github.com/yireyun/go-queue.testQueueGeneral.func1()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:198 +0x257

Goroutine 56 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x345
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 54 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:194 +0x2b1
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
==================
WARNING: DATA RACE
Read at 0x00c421c08250 by goroutine 56:
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:99 +0x148
  github.com/yireyun/go-queue.testQueueGeneral.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:209 +0xf5

Previous write at 0x00c421c08250 by goroutine 54:
  [failed to restore the stack]

Goroutine 56 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x345
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 54 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:194 +0x2b1
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
==================
WARNING: DATA RACE
Read at 0x00c421c08240 by goroutine 56:
  github.com/yireyun/go-queue.(*EsQueue).Get()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:100 +0x175
  github.com/yireyun/go-queue.testQueueGeneral.func2()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:209 +0xf5

Previous write at 0x00c421c08240 by goroutine 54:
  [failed to restore the stack]

Goroutine 56 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x345
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c

Goroutine 54 (running) created at:
  github.com/yireyun/go-queue.testQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:194 +0x2b1
  github.com/yireyun/go-queue.TestQueueGeneral()
      /home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x464
  testing.tRunner()
      /home/cholerae/gopath/go/src/testing/testing.go:754 +0x16c
==================
go1.9beta2, Grp:   1, Times:     100000, miss:     1, use: 1m19.838209296s, 798.382µs/op
SIGQUIT: quit
PC=0x416b82 m=0 sigcode=0

goroutine 278 [running]:
created by github.com/yireyun/go-queue.testQueueGeneral
	/home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x346

goroutine 1 [chan receive, 9 minutes]:
testing.(*T).Run(0xc420096000, 0x5d2597, 0x10, 0x5d95b8, 0xc420051c00)
	/home/cholerae/gopath/go/src/testing/testing.go:801 +0x5c7
testing.runTests.func1(0xc420096000)
	/home/cholerae/gopath/go/src/testing/testing.go:1053 +0xa8
testing.tRunner(0xc420096000, 0xc420051d90)
	/home/cholerae/gopath/go/src/testing/testing.go:754 +0x16d
testing.runTests(0xc42000c060, 0x6b6e80, 0x6, 0x6, 0x4159b0)
	/home/cholerae/gopath/go/src/testing/testing.go:1051 +0x522
testing.(*M).Run(0xc420051f20, 0x2ba7b28)
	/home/cholerae/gopath/go/src/testing/testing.go:932 +0x207
main.main()
	github.com/yireyun/go-queue/_test/_testmain.go:54 +0x1d4

goroutine 5 [syscall, 9 minutes]:
os/signal.signal_recv(0x486401)
	/home/cholerae/gopath/go/src/runtime/sigqueue.go:131 +0xa6
os/signal.loop()
	/home/cholerae/gopath/go/src/os/signal/signal_unix.go:22 +0x30
created by os/signal.init.0
	/home/cholerae/gopath/go/src/os/signal/signal_unix.go:28 +0x4f

goroutine 260 [semacquire, 7 minutes]:
sync.runtime_Semacquire(0xc421ab206c)
	/home/cholerae/gopath/go/src/runtime/sema.go:56 +0x39
sync.(*WaitGroup).Wait(0xc421ab2060)
	/home/cholerae/gopath/go/src/sync/waitgroup.go:131 +0xb4
github.com/yireyun/go-queue.testQueueGeneral(0xc4200960f0, 0x2, 0x186a0, 0x6)
	/home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:219 +0x36c
github.com/yireyun/go-queue.TestQueueGeneral(0xc4200960f0)
	/home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:74 +0x465
testing.tRunner(0xc4200960f0, 0x5d95b8)
	/home/cholerae/gopath/go/src/testing/testing.go:754 +0x16d
created by testing.(*T).Run
	/home/cholerae/gopath/go/src/testing/testing.go:800 +0x598

goroutine 279 [runnable]:
github.com/yireyun/go-queue.(*EsQueue).Get(0xc4218c0090, 0x1, 0xc40002ee78, 0x1ec800000001)
	/home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_read.go:69 +0x28e
github.com/yireyun/go-queue.testQueueGeneral.func2(0xc421ab2060, 0x186a0, 0xc4218c0090, 0xc421ab2070, 0xc421ab202c, 0x1)
	/home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:209 +0xf6
created by github.com/yireyun/go-queue.testQueueGeneral
	/home/cholerae/gopath/src/github.com/yireyun/go-queue/esQueue_test.go:205 +0x346

rax    0x7fe14a5a2408
rbx    0x7fe13c0313d8
rcx    0xc4202f6fb1
rdx    0x63140
rdi    0xc420501b58
rsi    0xc420501b58
rbp    0xc420501b58
rsp    0x7ffecf58cc80
r8     0x7ffecf58cd20
r9     0xc420501b59
r10    0x0
r11    0x8ea3a
r12    0xc420501b59
r13    0x1
r14    0x0
r15    0xc420501b58
rip    0x416b82
rflags 0x297
cs     0x33
fs     0x0
gs     0x0
*** Test killed with quit: ran too long (10m0s).
FAIL	github.com/yireyun/go-queue	600.025s

怎么能直接操作一个 CAS 的变量?除了 sync/atomic 包以外,即使是在 x86 或者 amd64 上 go 也没有提供任何原子操作的保证。

panic and more miss

Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz 2.11 GHz
8.00 GB (7.76 GB 可用)
Windows 10 家庭中文版

PS D:\temp\go-queue> go test -race        
go1.17.8, Grp:   1, Times:    1000000, miss:  2276, use:   4.2984884s,  4.298µs/op
go1.17.8, Grp:   2, Times:    2000000, miss: 14993, use:  14.5299581s,  7.264µs/op
go1.17.8, Grp:   3, Times:    3000000, miss: 33229, use:  24.6319776s,   8.21µs/op
go1.17.8, Grp:   4, Times:    4000000, miss: 50272, use:  19.9088221s,  4.977µs/op
go1.17.8, Grp:   5, Times:    5000000, miss: 87873, use:  27.8026844s,   5.56µs/op
go1.17.8, Grp:   6, Times:    6000000, miss:131258, use:  32.7322928s,  5.455µs/op
go1.17.8, Grp:   7, Times:    7000000, miss:223056, use:  46.5430837s,  6.649µs/op
panic: test timed out after 10m0s

goroutine 1171 [running]:
testing.(*M).startAlarm.func1()
        D:/APP/go/src/testing/testing.go:1788 +0xbb
created by time.goFunc
        D:/APP/go/src/time/sleep.go:180 +0x4a

goroutine 1 [chan receive, 8 minutes]:
testing.(*T).Run(0xc0001051e0, {0x2b043d, 0x10}, 0x2b9978)
        D:/APP/go/src/testing/testing.go:1307 +0x752
testing.runTests.func1(0x0)
        D:/APP/go/src/testing/testing.go:1598 +0x9a
testing.tRunner(0xc0001051e0, 0xc000143bf8)
        D:/APP/go/src/testing/testing.go:1259 +0x230
testing.runTests(0xc00016e000, {0x3d8da0, 0x6, 0x6}, {0x0, 0x1b376daffff, 0x3dcbc0})
        D:/APP/go/src/testing/testing.go:1596 +0x7cb
testing.(*M).Run(0xc00016e000)
        D:/APP/go/src/testing/testing.go:1504 +0x9d2
main.main()
        _testmain.go:53 +0x22c

goroutine 687 [semacquire, 6 minutes]:
sync.runtime_Semacquire(0xc0011f2db4)
        D:/APP/go/src/runtime/sema.go:56 +0x25
sync.(*WaitGroup).Wait(0xc0011f2db4)
        D:/APP/go/src/sync/waitgroup.go:130 +0xf1
_/D_/temp/go-queue.testQueueGeneral(0xc000a5ba00, 0x8, 0xf4240)
        D:/temp/go-queue/esQueue_test.go:227 +0x545
_/D_/temp/go-queue.TestQueueGeneral(0x0)
        D:/temp/go-queue/esQueue_test.go:74 +0x285
testing.tRunner(0xc000a5ba00, 0x2b9978)
        D:/APP/go/src/testing/testing.go:1259 +0x230
created by testing.(*T).Run
        D:/APP/go/src/testing/testing.go:1306 +0x727

goroutine 1155 [runnable]:
runtime.Gosched()
        D:/APP/go/src/runtime/proc.go:322 +0x1a
_/D_/temp/go-queue.(*EsQueue).Get(0xc0001385d0)
        D:/temp/go-queue/esQueue.go:195 +0x125
_/D_/temp/go-queue.testQueueGeneral.func2(0x0)
        D:/temp/go-queue/esQueue_test.go:217 +0x105
created by _/D_/temp/go-queue.testQueueGeneral
        D:/temp/go-queue/esQueue_test.go:213 +0x330

goroutine 1105 [sleep]:
time.Sleep(0x3e8)
        D:/APP/go/src/runtime/time.go:193 +0x133
_/D_/temp/go-queue.testQueueGeneral.func1(0x0)
        D:/temp/go-queue/esQueue_test.go:204 +0x251
created by _/D_/temp/go-queue.testQueueGeneral
        D:/temp/go-queue/esQueue_test.go:198 +0x129
exit status 2
FAIL    _/D_/temp/go-queue      600.799s

队列满的检查是否有问题:posCnt >= capMod-1

我对你的代码作了如下的改动,代码还是可以通过所有测试。好奇这里是故意这么写还是写错了?
我感觉capMod就是capacity-1,Queue的实际容量应该就是capacity-1,所以capMod应该不需要再减1了啊。

diff --git a/esQueue.go b/esQueue.go
index a17e4be..45f9b0c 100644
--- a/esQueue.go
+++ b/esQueue.go
@@ -81,7 +81,7 @@ func (q *EsQueue) Put(val interface{}) (ok bool, quantity uint32) {
                posCnt = capMod + (putPos - getPos)
        }
 
-       if posCnt >= capMod-1 {
+       if posCnt >= capMod {
                runtime.Gosched()
                return false, posCnt
        }
@@ -121,7 +121,7 @@ func (q *EsQueue) Puts(values []interface{}) (puts, quantity uint32) {
                posCnt = capMod + (putPos - getPos)
        }
 
-       if posCnt >= capMod-1 {
+       if posCnt >= capMod {
                runtime.Gosched()
                return 0, posCnt
        }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.