frasco-tasks

Celery integration for Frasco


License
MIT
Install
pip install frasco-tasks==0.5.0

Documentation

Frasco-Tasks

Adds the possibility to run actions in the background using celery.

Installation

pip install frasco-tasks

Setup

Feature name: tasks

Options:

  • broker_url: celery's broker url
  • result_backend: celery's result backend
  • schedule: see below
  • all other options will be added to the celery config

broker_url is optional and if not provided will be localhost. However, if Frasco-Redis is available, it will automatically use the same redis server. When the broker is automatically selected, the result backend will also use the same redis server.

Actions

enqueue

The enqueue action allows you to enqueue actions to be run later by a worker. These actions will be run out of a request context and thus cannot depend on it.

Options:

  • action: the action name (default option)
  • all other options will be forwarded to the enqueued action

## Running a worker

The feature provides a worker command which allows to start a worker. Multiple workers can be started if the work is heavy.

$ frasco worker

Note that a worker is automatically started with frasco run.

Scheduling

You can schedule task to be executed at certain times using Celery Beat. The schedule option is a hash where keys are action names and their value a crontab schedule.

In the following example, the action named my_action will be executed every 30 minutes.

features:
  - tasks:
      schedule:
        my_action: */30 * * * *

Data serialization

The data will be serialied to json when enqueued. This can create problems when passing objects. To ensure that an object is encoded and decoded properly to/from json, define the __taskdump__ and __taskload__ method on your objects.

__taskdump__ must return a tuple containing the class name and a state object which must be JSON compatible.

__taskload__ is a class method which takes as argument the state object and must return an object.

class MyObject(object):
    def __init__(self, id):
        self.id = id

    def __taskdump__(self):
        return 'MyObject', self.id

    @classmethod
    def __taskload__(cls, id):
        return MyObject(id)