module Marmot
Overview
Marmot is a non concurrent scheduler.
Marmot schedules tasks on three possibles ways:
- on a periodic span (
Marmot.repeat
) - every day at a given time (
Marmot.cron
) - when a value is available on a channel (
Marmot.on
)
Tasks are all executed on the same fiber.
This means two things: first, you don't have to worry about concurrency
(your tasks can share objects which does not support concurrency, like
HTTP::Client
), and second, they must not block (too much).
If you want to execute jobs concurrently, you must spawn a new fiber inside your
tasks.
A task receive a unique parameter which is an object representing itself.
It can be canceled with Marmot::Task#cancel
, from inside or outside the task.
A canceled task can never be started again.
Tasks do not start when created.
Instead, the main entrypoint is Marmot.run
, which blocks while there are tasks
to run. If there is no tasks to run, or they are all canceled, it stops.
The blocking behavior can also be stopped by calling Marmot.stop
.
As Marmot.run
is blocking, you probably want to call Marmot.stop
from a task
or from another fiber.
When stopped, the tasks are not canceled and they will run again if Marmot.run
is called again.
To cancel all the tasks there is Marmot.cancel_all_tasks
.
Extended Modules
Defined in:
marmot.crConstant Summary
-
Log =
::Log.for(self)
-
VERSION =
"0.2.2"
Instance Method Summary
-
#cancel_all_tasks : Nil
Cancels all the tasks.
-
#cron(hour, minute, second = 0, &block : Callback) : Task
Runs a task every day at hour and minute.
-
#on(channel, &block : Callback) : Task
Runs a task when a value is received on a channel.
-
#repeat(span : Time::Span, first_run = false, &block : Callback) : Task
Runs a task every given span.
-
#run : Nil
Starts scheduling the tasks.
-
#stop
Stops scheduling the tasks.
Instance Method Detail
Runs a task every day at hour and minute.
Runs a task when a value is received on a channel.
To access the value, you need to restrict the type of the task, and use
OnChannelTask#value
.
channel = Channel(Int32).new
Marmot.on(channel) { |task| puts task.as(OnChannelTask).value }
Runs a task every given span.
If first run is true, it will run as soon as the scheduler runs. Else it will wait span time before running for first time.