Running a Simulation#
This tutorial shows how to run a tickit simulation both within a single process and distributed across multiple processes.
Within a Single Process#
Tickit simulations may be launched within a single process by executing a command of
the following format python -m tickit all [OPTIONS] CONFIG_PATH
in which all
denotes that both a MasterScheduler
and the components defined in the config should
be started within the process.
In this tutorial we shall run the sunk trampoline example configuration, located at
examples/configs/sunk-trampoline.yaml
, as such a simulation may be launched in a
single process by executing the following command:
python -m tickit all examples/configs/sunk-trampoline.yaml
Once run, we expect to see an output akin to:
Doing tick @ 0
rand_tramp got Input(target='rand_tramp', time=0, changes=immutables.Map({}))
Boing! (delta: 0, inputs: immutables.Map({}), output: 225)
Scheduler got Output(source='rand_tramp', time=0, changes=immutables.Map({'output': 225}), call_in=1000000000)
Scheduling Wakeup(component='rand_tramp', when=1000000000)
tramp_sink got Input(target='tramp_sink', time=0, changes=immutables.Map({'input': 225}))
Sunk {'input': 225}
Scheduler got Output(source='tramp_sink', time=0, changes=immutables.Map({}), call_in=None)
Doing tick @ 1000000000
rand_tramp got Input(target='rand_tramp', time=1000000000, changes=immutables.Map({}))
Boing! (delta: 1000000000, inputs: immutables.Map({}), output: 139)
Scheduler got Output(source='rand_tramp', time=1000000000, changes=immutables.Map({'output': 139}), call_in=1000000000)
Scheduling Wakeup(component='rand_tramp', when=2000000000)
tramp_sink got Input(target='tramp_sink', time=1000000000, changes=immutables.Map({'input': 139}))
Sunk {'input': 139}
Scheduler got Output(source='tramp_sink', time=1000000000, changes=immutables.Map({}), call_in=None)
Across Multiple Processes#
In order to run across multiple processes a message broking service must be utilized. As such, prior to launching any instances of Tickit a message broker must be launched; In this example we will use apache kafka (the default distributed broker for Tickit), which may be installed and launched according to steps 1 and 2 of the apache kafka quickstart guide.
Tickit simulations may be launched across multiple processes by executing a command of
the format python -m tickit scheduler [OPTIONS] CONFIG_PATH
to launch a
MasterScheduler
and commands of the format
python -m tickit device [OPTIONS] DEVICE CONFIG_PATH
for each component within the
simulation.
Running a MasterScheduler
for the sunk trampoline example is performed as:
python -m tickit scheduler examples/configs/sunk-trampoline.yaml
Once run, we expect to see an output akin to:
Doing tick @ 0
Topic tickit-rand_tramp-in is not available during auto-create initialization
Topic tickit-tramp_sink-out is not available during auto-create initialization
Topic tickit-rand_tramp-out is not available during auto-create initialization
Running the rand_tramp
device for the sunk trampoline example is performed as:
python -m tickit device rand_tramp examples/configs/sunk-trampoline.yaml
Once run, we expect to see an output akin to:
rand_tramp got Input(target='rand_tramp', time=0, changes=immutables.Map({}))
Boing! (delta: 0, inputs: immutables.Map({}), output: 162)
With the following being emitted by the MasterScheduler
process:
Scheduler got Output(source='rand_tramp', time=0, changes=immutables.Map({'output': 162}), call_in=1000000000)
Scheduling Wakeup(component='rand_tramp', when=1000000000)
Topic tickit-tramp_sink-in is not available during auto-create initialization
Finally we may run the tramp_sink
device for the sunk trampoline example via the
following command:
python -m tickit device tramp_sink examples/configs/sunk-trampoline.yaml
Once run, we expect to see an output akin to:
tramp_sink got Input(target='tramp_sink', time=0, changes=immutables.Map({'input': 162}))
Sunk {'input': 162}
With the following being emitted by the MasterScheduler
process:
Scheduler got Output(source='tramp_sink', time=0, changes=immutables.Map({}), call_in=None)
After which the simulation should continue as expected, with relevant information produced by each of the processes.