11using Unitful
2+ using Base. Threads
3+ using Static
24
35export TickedScheduler
46
@@ -12,20 +14,26 @@ A scheduler that processes jobs at regular tick intervals.
1214- `jobs::Vector{Job}`: The jobs to be scheduled
1315- `ticker::Ticker{T}`: The ticker that manages timing
1416"""
15- struct TickedScheduler{C <: Clock , T, V} <: Scheduler
17+ struct TickedScheduler{C <: Clock , T, V, B } <: Scheduler
1618 clock:: C
1719 jobs:: V
1820 ticker:: Ticker{T}
21+ threading:: B
1922end
2023
2124"""
2225 TickedScheduler(clock::Clock, tick_period::T) where {T}
2326
2427Create a new TickedScheduler with the specified clock and tick period.
2528"""
26- function TickedScheduler (clock:: Clock , tick_period:: T ) where {T}
29+ function TickedScheduler (clock:: Clock , tick_period:: T ; threading :: Bool = false ) where {T}
2730 tick_period = convert (Quantity{Float64}, tick_period)
28- TickedScheduler (clock, Job[], Ticker (tick_period, convert (typeof (tick_period), now (clock)), zero (tick_period)))
31+ TickedScheduler (
32+ clock,
33+ Job[],
34+ Ticker (tick_period, convert (typeof (tick_period), now (clock)), zero (tick_period)),
35+ static (threading)
36+ )
2937end
3038
3139"""
@@ -47,17 +55,28 @@ function update!(scheduler::TickedScheduler)
4755 advance_to! (scheduler. ticker, current_time)
4856
4957 while can_tick (scheduler. ticker)
50- foreach (scheduler. jobs) do job
51- progress! (job, scheduler. ticker. period)
52- end
58+ _process_jobs! (scheduler)
5359 consume_tick! (scheduler. ticker)
5460 end
5561end
5662
63+ function _process_jobs! (scheduler:: TickedScheduler{C, T, V, <:False} ) where {C, T, V}
64+ foreach (scheduler. jobs) do job
65+ progress! (job, scheduler. ticker. period)
66+ end
67+ end
68+
69+ function _process_jobs! (scheduler:: TickedScheduler{C, T, V, <:True} ) where {C, T, V}
70+ tasks = map (scheduler. jobs) do job
71+ @spawn progress! (job, scheduler. ticker. period)
72+ end
73+ wait .(tasks)
74+ end
75+
5776function get_period (scheduler:: TickedScheduler )
5877 return scheduler. ticker. period
5978end
6079
6180function compile (scheduler:: TickedScheduler )
62- return TickedScheduler (scheduler. clock, (scheduler. jobs... ,), scheduler. ticker)
81+ return TickedScheduler (scheduler. clock, (scheduler. jobs... ,), scheduler. ticker, scheduler . threading )
6382end
0 commit comments