Files
deb-python-taskflow/doc/source/notifications.rst
Joshua Harlow 778e210e17 Include the 'old_state' in all currently provided listeners
Since the key 'old_state' is now standard across all notifications
sent from flows, retries or tasks we can safely use it in the listeners
without worrying about hitting key errors when it does not exist/is not
provided.

This also adds an example which shows how to use the dynamic logging
listener to view this information.

Change-Id: If4456440674347a3fe4972d9d0fa16ba8373ef9f
2015-01-10 20:16:15 -08:00

5.9 KiB

Notifications and listeners

from taskflow import task from taskflow.patterns import linear_flow from taskflow import engines

Overview

Engines provide a way to receive notification on task and flow state transitions, which is useful for monitoring, logging, metrics, debugging and plenty of other tasks.

To receive these notifications you should register a callback with an instance of the :py~taskflow.types.notifier.Notifier class that is attached to :py~taskflow.engines.base.Engine attributes atom_notifier and notifier.

TaskFlow also comes with a set of predefined listeners <listeners>, and provides means to write your own listeners, which can be more convenient than using raw callbacks.

Receiving notifications with callbacks

Flow notifications

To receive notification on flow state changes use the :py~taskflow.types.notifier.Notifier instance available as the notifier property of an engine.

A basic example is:

>>> class CatTalk(task.Task): ... def execute(self, meow): ... print(meow) ... return "cat" ... >>> class DogTalk(task.Task): ... def execute(self, woof): ... print(woof) ... return 'dog' ... >>> def flow_transition(state, details): ... print("Flow '%s' transition to state %s" % (details['flow_name'], state)) ... >>> >>> flo = linear_flow.Flow("cat-dog").add( ... CatTalk(), DogTalk(provides="dog")) >>> eng = engines.load(flo, store={'meow': 'meow', 'woof': 'woof'}) >>> eng.notifier.register("*", flow_transition) >>> eng.run() Flow 'cat-dog' transition to state RUNNING meow woof Flow 'cat-dog' transition to state SUCCESS

Task notifications

To receive notification on task state changes use the :py~taskflow.types.notifier.Notifier instance available as the atom_notifier property of an engine.

A basic example is:

>>> class CatTalk(task.Task): ... def execute(self, meow): ... print(meow) ... return "cat" ... >>> class DogTalk(task.Task): ... def execute(self, woof): ... print(woof) ... return 'dog' ... >>> def task_transition(state, details): ... print("Task '%s' transition to state %s" % (details['task_name'], state)) ... >>> >>> flo = linear_flow.Flow("cat-dog") >>> flo.add(CatTalk(), DogTalk(provides="dog")) <taskflow.patterns.linear_flow.Flow object at 0x...> >>> eng = engines.load(flo, store={'meow': 'meow', 'woof': 'woof'}) >>> eng.task_notifier.register("*", task_transition) >>> eng.run() Task 'CatTalk' transition to state RUNNING meow Task 'CatTalk' transition to state SUCCESS Task 'DogTalk' transition to state RUNNING woof Task 'DogTalk' transition to state SUCCESS

Listeners

TaskFlow comes with a set of predefined listeners -- helper classes that can be used to do various actions on flow and/or tasks transitions. You can also create your own listeners easily, which may be more convenient than using raw callbacks for some use cases.

For example, this is how you can use :py~taskflow.listeners.printing.PrintingListener:

>>> from taskflow.listeners import printing >>> class CatTalk(task.Task): ... def execute(self, meow): ... print(meow) ... return "cat" ... >>> class DogTalk(task.Task): ... def execute(self, woof): ... print(woof) ... return 'dog' ... >>> >>> flo = linear_flow.Flow("cat-dog").add( ... CatTalk(), DogTalk(provides="dog")) >>> eng = engines.load(flo, store={'meow': 'meow', 'woof': 'woof'}) >>> with printing.PrintingListener(eng): ... eng.run() ... <taskflow.engines.action_engine.engine.SerialActionEngine object at ...> has moved flow 'cat-dog' (...) into state 'RUNNING' from state 'PENDING' <taskflow.engines.action_engine.engine.SerialActionEngine object at ...> has moved task 'CatTalk' (...) into state 'RUNNING' from state 'PENDING' meow <taskflow.engines.action_engine.engine.SerialActionEngine object at ...> has moved task 'CatTalk' (...) into state 'SUCCESS' from state 'RUNNING' with result 'cat' (failure=False) <taskflow.engines.action_engine.engine.SerialActionEngine object at ...> has moved task 'DogTalk' (...) into state 'RUNNING' from state 'PENDING' woof <taskflow.engines.action_engine.engine.SerialActionEngine object at ...> has moved task 'DogTalk' (...) into state 'SUCCESS' from state 'RUNNING' with result 'dog' (failure=False) <taskflow.engines.action_engine.engine.SerialActionEngine object at ...> has moved flow 'cat-dog' (...) into state 'SUCCESS' from state 'RUNNING'

Basic listener

taskflow.listeners.base.Listener

Printing and logging listeners

taskflow.listeners.base.DumpingListener

taskflow.listeners.logging.LoggingListener

taskflow.listeners.logging.DynamicLoggingListener

taskflow.listeners.printing.PrintingListener

Timing listener

taskflow.listeners.timing.TimingListener

taskflow.listeners.timing.PrintingTimingListener

Claim listener

taskflow.listeners.claims.CheckingClaimListener

Hierarchy

taskflow.listeners.base.DumpingListener taskflow.listeners.base.Listener taskflow.listeners.claims.CheckingClaimListener taskflow.listeners.logging.DynamicLoggingListener taskflow.listeners.logging.LoggingListener taskflow.listeners.printing.PrintingListener taskflow.listeners.timing.PrintingTimingListener taskflow.listeners.timing.TimingListener