Skip to content

所有 workers 发生 panic 导致那些正在等待可用 worker 的调用方阻塞住 #146

Closed
@shangxiaomi

Description

@shangxiaomi

Describe the bug
极端情况下,协程的执行速度为ExpiryDuration的时长

To Reproduce
Steps to reproduce the behavior:

  1. 创建一个size为1,ExpiryDuration为10s的协程池
  2. 创建一个每次必panic的函数panicFunc
  3. 向协程池添加5次panicFunc任务,并且后续不会再添加新的任务
  4. 结果每10s(也就是设定的ExpiryDuration的时长)才会打印一次panic堆栈

代码如下:

package main

import (
	"fmt"
	"sync"
	"time"

	"github.com/panjf2000/ants/v2"
)

func main() {
	runTimes := 5
	var wg sync.WaitGroup
	pool, _ := ants.NewPool(1, ants.WithExpiryDuration(10 * time.Second))
	panicFunc := func() {
		time.Sleep(10 * time.Millisecond)
		wg.Done()
		panic("test panic")
	}
	for i := 0; i < runTimes; i++ {
		wg.Add(1)
		_ = pool.Submit(panicFunc)
	}
	wg.Wait()
	fmt.Printf("running goroutines: %d\n", pool.Running())
}

Expected behavior
5次panic应该堆栈很快就打印完

Error messages/Trace logs

2021/03/25 21:10:15 worker exits from a panic: test panic
2021/03/25 21:10:15 worker exits from panic: goroutine 8 [running]:
github.com/panjf2000/ants/v2.(*goWorker).run.func1.1(0xc000072180)
        /Users/admin/dev/ginlearn/ants/worker.go:58 +0x161
panic(0x10b2d60, 0x10f3fa0)
        /usr/local/opt/go@1.13/libexec/src/runtime/panic.go:679 +0x1b2
main.main.func1()
        /Users/admin/dev/ginlearn/ants/examples/test_panic/main.go:18 +0x67
github.com/panjf2000/ants/v2.(*goWorker).run.func1(0xc000072180)
        /Users/admin/dev/ginlearn/ants/worker.go:68 +0xa5
created by github.com/panjf2000/ants/v2.(*goWorker).run
        /Users/admin/dev/ginlearn/ants/worker.go:48 +0x4c

2021/03/25 21:10:25 worker exits from a panic: test panic
2021/03/25 21:10:25 worker exits from panic: goroutine 18 [running]:
github.com/panjf2000/ants/v2.(*goWorker).run.func1.1(0xc0000c8000)
        /Users/admin/dev/ginlearn/ants/worker.go:58 +0x161
panic(0x10b2d60, 0x10f3fa0)
        /usr/local/opt/go@1.13/libexec/src/runtime/panic.go:679 +0x1b2
main.main.func1()
        /Users/admin/dev/ginlearn/ants/examples/test_panic/main.go:18 +0x67
github.com/panjf2000/ants/v2.(*goWorker).run.func1(0xc0000c8000)
        /Users/admin/dev/ginlearn/ants/worker.go:68 +0xa5
created by github.com/panjf2000/ants/v2.(*goWorker).run
        /Users/admin/dev/ginlearn/ants/worker.go:48 +0x4c

2021/03/25 21:10:35 worker exits from a panic: test panic
2021/03/25 21:10:35 worker exits from panic: goroutine 33 [running]:
github.com/panjf2000/ants/v2.(*goWorker).run.func1.1(0xc0000e6000)
        /Users/admin/dev/ginlearn/ants/worker.go:58 +0x161
panic(0x10b2d60, 0x10f3fa0)
        /usr/local/opt/go@1.13/libexec/src/runtime/panic.go:679 +0x1b2
main.main.func1()
        /Users/admin/dev/ginlearn/ants/examples/test_panic/main.go:18 +0x67
github.com/panjf2000/ants/v2.(*goWorker).run.func1(0xc0000e6000)
        /Users/admin/dev/ginlearn/ants/worker.go:68 +0xa5
created by github.com/panjf2000/ants/v2.(*goWorker).run
        /Users/admin/dev/ginlearn/ants/worker.go:48 +0x4c

2021/03/25 21:10:45 worker exits from a panic: test panic
2021/03/25 21:10:45 worker exits from panic: goroutine 49 [running]:
github.com/panjf2000/ants/v2.(*goWorker).run.func1.1(0xc000072180)
        /Users/admin/dev/ginlearn/ants/worker.go:58 +0x161
panic(0x10b2d60, 0x10f3fa0)
        /usr/local/opt/go@1.13/libexec/src/runtime/panic.go:679 +0x1b2
main.main.func1()
        /Users/admin/dev/ginlearn/ants/examples/test_panic/main.go:18 +0x67
github.com/panjf2000/ants/v2.(*goWorker).run.func1(0xc000072180)
        /Users/admin/dev/ginlearn/ants/worker.go:68 +0xa5
created by github.com/panjf2000/ants/v2.(*goWorker).run
        /Users/admin/dev/ginlearn/ants/worker.go:48 +0x4c

2021/03/25 21:10:55 worker exits from a panic: test panic
2021/03/25 21:10:55 worker exits from panic: goroutine 51 [running]:
github.com/panjf2000/ants/v2.(*goWorker).run.func1.1(0xc0000e6000)
        /Users/admin/dev/ginlearn/ants/worker.go:58 +0x161
panic(0x10b2d60, 0x10f3fa0)
        /usr/local/opt/go@1.13/libexec/src/runtime/panic.go:679 +0x1b2
main.main.func1()
        /Users/admin/dev/ginlearn/ants/examples/test_panic/main.go:18 +0x67
github.com/panjf2000/ants/v2.(*goWorker).run.func1(0xc0000e6000)
        /Users/admin/dev/ginlearn/ants/worker.go:68 +0xa5
created by github.com/panjf2000/ants/v2.(*goWorker).run
        /Users/admin/dev/ginlearn/ants/worker.go:48 +0x4c

running goroutines: 0

System info (please complete the following information):

  • OS: macOS 11.2.3
  • Go Version: go1.13.15 darwin/amd64
  • ants version: v2.4.3

Additional context
感觉这种情况很极端,生产环境中几乎不会存在,不知有没有修复的必要。

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions