Quick Start

Install

Install with pip:

$ pip install pyramid_cron

For each web app which uses pyramid_cron, you’ll need to fire the cron handler from a whitelisted IP once per minute. An easy way to do this is by adding a cron job on the app server:

* * * * *   curl -o /dev/null http://localhost/cron

Integrate with a Pyramid App

Include pyramid_cron, by calling config.include('pyramid_cron') or adding pyramid_cron to pyramid.includes.

Register a Task

Register at least one task, using the config.add_cron_task() directive. You can also pass a dotted string (e.g. myapp.tasks.some_task) which will be resolved relative to the calling module.

Tasks are functions which accept a single system argument. system is a dict with two keys: request and registry, both of which refer to the Pyramid objects of that name.

def my_task(system):
    registry = system['registry']
    request = system['request']
    # do stuff

# Run every 3 hours.
config.add_cron_task(my_task, hour=(0, 24, 3))

See API Reference for more details.

Request Scope Caveats

All tasks that are run during a given minute will be run in the scope of the same request. This may impose constraints on your tasks, for example:

  • Depending on your transaction management infrastructure, tasks will share the same SQL session.
  • An accumulation of slow tasks may lead to an abnormally long HTTP request, tying up resources or exceeding your webserver’s timeout threshold.
  • Ideally, tasks which are on the slower side should be staggered so that they’re unlikely to run at the same time.

Logging

Information about task execution (and timing) is logged to the pyramid_cron handler. If you wish to record it, you should configure logging explicitly for that handler in your app.