-
-
Notifications
You must be signed in to change notification settings - Fork 64
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Exceptions may occur when closing the pool #20
Comments
Hey @zhu121, This is the expected behaviour in that scenario. When the process is shutting down, it's the application's reponsibility to make sure no more tasks are submitted to the pool after it was stopped (by calling A common pattern to signal a goroutine to stop its processing (in this case, stop sending tasks to the pool) is to use an "exit" channel, doing something like this: func TestStop(t *testing.T) {
pool := New(1, 30, MinWorkers(1), IdleTimeout(1*time.Second))
// Simulate some users sending tasks to the pool
quit := make(chan struct{})
go func() {
for i := 0; i < 30; i++ {
select {
case <-quit:
// Quit signal received, stop sending tasks
return
default:
pool.Submit(func() {
fmt.Println("do task")
time.Sleep(1 * time.Second)
})
}
time.Sleep(1 * time.Second)
}
}()
// Suppose the server is shut down after a period of time
time.Sleep(5 * time.Second)
// Send exit signal
quit <- struct{}{}
// Wait for all tasks to complete
pool.StopAndWait()
} |
Another way I think of is to modify the submit function like this: func (p *WorkerPool) submit(task func(), canWaitForIdleWorker bool) (submitted bool) {
defer func() {
// Avoid exceptions in the external goroutine and judge the submitted results
if r := recover(); r != nil {
submitted = false
}
}()
// other codes
} |
I see. Agree that submitting a task to a closed worker pool should not panic if the call is made using |
Hey @zhu121! I finally had some time to work on this and opened a pull request (#22) to improve handling of task submission when pool is being stopped. The latest release of pond (1.6.1) includes these changes. Please take a look when you get a chance and let me know if that's in line with your suggestion. |
A small idea. Will adding |
Adding |
Modifying the function interface directly will indeed affect existing users. Thank you for your answer. I closed this problem first |
Assuming that the pool is limited in size and is busy, an exception will occur when the pool is closed and the external task is still sending to the pool.
Test code:
panic: send on closed channel
The text was updated successfully, but these errors were encountered: