yireyun / go-queue Goto Github PK
View Code? Open in Web Editor NEWHigh-performance lock-free queue (Disruptor 1400/s)
License: BSD 3-Clause "New" or "Revised" License
High-performance lock-free queue (Disruptor 1400/s)
License: BSD 3-Clause "New" or "Revised" License
One goroutine do puts and the other do gets, but gets nothing.
putPos increased then getPos always 0(zero)...
您好,我在阅读您的queue源码时,对func (q *EsQueue) Get() (val interface{}, ok bool, quantity uint32)
实现有一些疑惑,该函数通过for循环配合runtime.Gosched()
来实现队列的阻塞访问,假设Get
方法调用带一个空在queue队列上,同时程序没有运行其他的goroutine, 此时CPU的占用率依然很好,因为此时没有额外的goroutine在运行,runtime.Gosched
的执行就变得没有意义,因为调度器只有这一个goroutine可以去调度,导致这个死循环一致在占用cpu,不知道这种情况下,队列该怎样设计才能在空队列的情况下,不会占用太多的cpu。
多协程读写下会有aba的事件发生的可能的。 cas aba 在lock free算法里是个问题。
源码:
`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毫秒。
`
我的想法是,分多个线程从同一个队列中取数据,如果每个线程取到的数据加起来应该等于总数,可现在的结果是多了。
This esQueue whill dead at this case, And I fix the bug in here: https://github.com/golangCasQueue/casQueue
bug reappear method:
go get github.com/yireyun/go-queue
git clone https://github.com/golangCasQueue/esQueueBug
cd esQueueBug
go test -bench="."
oh! bomb!
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()
}
在队列为空的前提下,Get或者Put操作堵塞后cpu的占用率很高,我的配置下是在28%左右
比如这段,
if posCnt >= capMod-1 {
runtime.Gosched()
return false, posCnt
}
你好,根据你的实现,我加了一些注释和小改动
https://github.com/bighunter513/goqueue
欢迎指正
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
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 也没有提供任何原子操作的保证。
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
Thanks for this open source project.
We are trying to use this in our project but we can't because the license of the code is unknown.
Could you please decide a license for your project and add a LICENSE file to the repo? Many thanks.
When the max num value, it will overflow
example:
var m uint32 = 4294967295
log.Println(minRoundNumBy2(m))
then, you will get 0
我对你的代码作了如下的改动,代码还是可以通过所有测试。好奇这里是故意这么写还是写错了?
我感觉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
}
建议benchmark输出channel和go-queue的对比?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.