Happy python library for keeping track of tasks and rerunning them. Creating and running a task is easy:
import task
@task.ify()
def doit(**kwargs):
print kwargs['task_id']
task.setup_db('sqlite://') # in memory db
task_id = doit()
task.run(task_id)
The wrapped method needs to accept **kwargs. It will be passed two kwargs: task_id and progress. Task_id holds the identifier for the task should you need it. Progress holds the last data you returned from the method.
The sexy way to use tasks is to define a generator that yields for each phase of the task. See the tests and example_* for examples of running tasks. If you have nose installed you can run the tests via nosetests.