mirror of https://github.com/go-co-op/gocron.git
parent
e1b7d52ebc
commit
63f3701d57
12
executor.go
12
executor.go
|
|
@ -36,6 +36,8 @@ type executor struct {
|
|||
|
||||
// used by the executor to receive a stop signal from the scheduler
|
||||
stopCh chan struct{}
|
||||
// ensure that stop runs before the next call to start and only runs once
|
||||
stopOnce *sync.Once
|
||||
// the timeout value when stopping
|
||||
stopTimeout time.Duration
|
||||
// used to signal that the executor has completed shutdown
|
||||
|
|
@ -88,6 +90,7 @@ func (e *executor) start() {
|
|||
// any other uses within the executor should create a context
|
||||
// using the executor context as parent.
|
||||
e.ctx, e.cancel = context.WithCancel(context.Background())
|
||||
e.stopOnce = &sync.Once{}
|
||||
|
||||
// the standardJobsWg tracks
|
||||
standardJobsWg := &waitGroupWithMutex{}
|
||||
|
|
@ -131,7 +134,7 @@ func (e *executor) start() {
|
|||
|
||||
// spin off into a goroutine to unblock the executor and
|
||||
// allow for processing for more work
|
||||
go func() {
|
||||
go func(executorCtx context.Context) {
|
||||
// make sure to cancel the above context per the docs
|
||||
// // Canceling this context releases resources associated with it, so code should
|
||||
// // call cancel as soon as the operations running in this Context complete.
|
||||
|
|
@ -211,8 +214,7 @@ func (e *executor) start() {
|
|||
}
|
||||
} else {
|
||||
select {
|
||||
case <-e.stopCh:
|
||||
e.stop(standardJobsWg, singletonJobsWg, limitModeJobsWg)
|
||||
case <-executorCtx.Done():
|
||||
return
|
||||
default:
|
||||
}
|
||||
|
|
@ -228,7 +230,7 @@ func (e *executor) start() {
|
|||
}(*j)
|
||||
}
|
||||
}
|
||||
}()
|
||||
}(e.ctx)
|
||||
case <-e.stopCh:
|
||||
e.stop(standardJobsWg, singletonJobsWg, limitModeJobsWg)
|
||||
return
|
||||
|
|
@ -473,6 +475,7 @@ func (e *executor) incrementJobCounter(j internalJob, status JobStatus) {
|
|||
}
|
||||
|
||||
func (e *executor) stop(standardJobsWg, singletonJobsWg, limitModeJobsWg *waitGroupWithMutex) {
|
||||
e.stopOnce.Do(func() {
|
||||
e.logger.Debug("gocron: stopping executor")
|
||||
// we've been asked to stop. This is either because the scheduler has been told
|
||||
// to stop all jobs or the scheduler has been asked to completely shutdown.
|
||||
|
|
@ -555,4 +558,5 @@ func (e *executor) stop(standardJobsWg, singletonJobsWg, limitModeJobsWg *waitGr
|
|||
if e.limitMode != nil {
|
||||
e.limitMode.started = false
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ func NewScheduler(options ...SchedulerOption) (Scheduler, error) {
|
|||
jobUpdateNextRuns: make(chan uuid.UUID),
|
||||
jobsOutCompleted: make(chan uuid.UUID),
|
||||
jobOutRequest: make(chan jobOutRequest, 1000),
|
||||
done: make(chan error),
|
||||
done: make(chan error, 1),
|
||||
}
|
||||
|
||||
s := &scheduler{
|
||||
|
|
|
|||
Loading…
Reference in New Issue