49 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # cycle-scheduler
 | |
| 
 | |
| cycle-scheduler is a simple scheduler handling jobs and executes them at regular interval.
 | |
| 
 | |
| Here a simple representation:
 | |
| ```ascii
 | |
| +------------------------------------------------------+
 | |
| | +---+ +---+ +---+ +---+ +---+                  +---+ |
 | |
| | |   | |   | |   | |   | |   |                  |   | |
 | |
| | |   | |   | |   | |   | |   |                  |   | |
 | |
| | |   | |   | |   | |   | |   |                  |   | |
 | |
| | |   | |   | |   | |   | |   |                  |   | |
 | |
| | |   | |   | |   | |   | |   |                  |   | |
 | |
| | |   | |   | |   | |   | |   |                  |   | |
 | |
| | |s1 | |s2 | |s3 | |s4 | |   |                  |s60| |
 | |
| | +---+ +---+ +---+ +---+ +---+                  +---+ |
 | |
| +---------------^--------------------------------------+
 | |
| ```
 | |
| Jobs are handle in a array of job slices.
 | |
| 
 | |
| At each interval (clock), the cursor `^` moves to the next slot (s*).
 | |
| If there are jobs, they are sent to workers to be executed
 | |
| and the slot is cleaned.
 | |
| At the end of the slot (s60), the cursor re-starts a new cycle from s1.
 | |
| 
 | |
| If a job is not in a desire state, the job is re-scheduled in the current slot to be re-executed in the next cycle.
 | |
| 
 | |
| **NOTE**: This scheduler does not accept long running tasks. Job execution have a fixed timeout of 10s.
 | |
| Pooling tasks are more suitable for this kind of scheduler.
 | |
| 
 | |
| ## Run
 | |
| You can run sample tests from `main.go` to see the scheduler in action:
 | |
| ```bash
 | |
| make run
 | |
| ```
 | |
| If all goes well, you should see this kind of output in the stdout:
 | |
| ```ascii
 | |
| # cycle-scheduler (slot: 7)
 | |
| _ P _ _ _ _ _ _ _ _ _ _ _ _
 | |
| - - - - - - ^ - - - - - - - 
 | |
| ```
 | |
| > **P** means *pending* state
 | |
| 
 | |
| You can adjust the clock interval as needed in `main.go`:
 | |
| ```go
 | |
| interval := 200 * time.Millisecond
 | |
| ```
 | |
| 
 |