Clock Triggered Tasks

In a datetime cycling suite the time represented by the cycle points bear no relation to the real-world time. Using clock-triggers we can make tasks wait until their cycle point time before running.

Clock-triggering effectively enables us to tether the “cycle time” to the “real world time” which we refer to as the wall-clock time.

Clock Triggering

When clock-triggering tasks we can use different offsets to the cycle time as follows:

clock-trigger = taskname(CYCLE_OFFSET)

Note

Regardless of the offset used, the task still belongs to the cycle from which the offset has been applied.

Example

Our example suite will simulate a clock chiming on the hour.

Within your ~/cylc-run directory create a new directory called clock-trigger:

mkdir ~/cylc-run/clock-trigger
cd ~/cylc-run/clock-trigger

Paste the following code into a suite.rc file:

[cylc]
    UTC mode = True # Ignore DST

[scheduling]
    initial cycle point = TODO
    final cycle point = +P1D # Run for one day
    [[dependencies]]
        [[[PT1H]]]
            graph = bell

[runtime]
    [[root]]
        [[[events]]]
            mail events = failed
    [[bell]]
        env-script = eval $(rose task-env)
        script = printf 'bong%.0s\n' $(seq 1 $(cylc cyclepoint --print-hour))

Change the initial cycle point to 00:00 this morning (e.g. if it was the first of January 2000 we would write 2000-01-01T00Z).

We now have a simple suite with a single task that prints “bong” a number of times equal to the (cycle point) hour.

Run your suite using:

cylc run clock-trigger

Stop the suite after a few cycles using the stop button in the cylc gui. Notice how the tasks run as soon as possible rather than waiting for the actual time to be equal to the cycle point.

Clock-Triggering Tasks

We want our clock to only ring in real-time rather than the simulated cycle time.

To do this, add the following lines to the [scheduling] section of your suite.rc:

[[special tasks]]
    clock-trigger = bell(PT0M)

This tells the suite to clock trigger the bell task with a cycle offset of 0 hours.

Save your changes and run your suite.

Your suite should now be running the bell task in real-time. Any cycle times that have already passed (such as the one defined by initial cycle time) will be run as soon as possible, while those in the future will wait for that time to pass.

At this point you may want to leave your suite running until the next hour has passed in order to confirm the clock triggering is working correctly. Once you are satisfied, stop your suite.

By making the bell task a clock triggered task we have made it run in real-time. Thus, when the wall-clock time caught up with the cycle time, the bell task triggered.

Adding More Clock-Triggered Tasks

We will now modify our suite to run tasks at quarter-past, half-past and quarter-to the hour.

Open your suite.rc and modify the [runtime] section by adding the following:

[[quarter_past, half_past, quarter_to]]
    script = echo 'chimes'

Edit the [[scheduling]] section to read:

[[special tasks]]
    clock-trigger = bell(PT0M), quarter_past(PT15M), half_past(PT30M), quarter_to(PT45M)
[[dependencies]]
    [[[PT1H]]]
        graph = """
            bell
            quarter_past
            half_past
            quarter_to
        """

Note the different values used for the cycle offsets of the clock-trigger tasks.

Save your changes and run your suite using:

cylc run clock-trigger now

Note

The now argument will run your suite using the current time for the initial cycle point.

Again, notice how the tasks trigger until the current time is reached.

Leave your suite running for a while to confirm it is working as expected and then shut it down using the stop button in the cylc gui.

Summary

  • Clock triggers are a type of dependency which cause tasks to wait for the wall-clock time to reach the cycle point time.
  • A clock trigger applies only to a single task.
  • Clock triggers can only be used in datetime cycling suites.

For more information see the Cylc User Guide.