Skip to main content

A workaround for the lack of dynamic tasks in Celery

Project description


The Celery daemon needs to be restarted every time an existing task is modified or new tasks are added.


Use only one Celery task that’s generic enough to run arbitrary Python functions with arbitrary arguments and wrap this task in a custom decorator.

As a bonus, the job will still work (synchronously) when Celery/the broker are not running.

The job’s calling API is the same as Celery’s: .s(), .delay() and .apply_async()


  • in which is in the same directory as, create a Celery app and then import the custom decorator:
import celery
import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), '.'))
#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
app = celery.Celery()

from generic_celery_task.decorators import task
  • start Celery along with its broker. You no longer need to restart Celery after this.
  • in another file, importable from, create your task:
from celeryapp import task

def job(x, y):
    return 'x + y = %d' % (x + y)
  • now use it:
import celery

# direct function call
assert job(1, 2) == 'x + y = 3'

# using the delay() method
res = job.delay(1, 2)
# if the Celery daemon and its backend broker are running, 'res' is an instance of AsyncResult
if isinstance(res, celery.result.AsyncResult):
    assert res.get() == 'x + y = 3'
    # if either one is not running, a warning is issued and the function is executed synchronously
    # with 'res' being the actual function result
    # if you want to silence the warnings, use '@task(quiet=True)'
    assert res == 'x + y = 3'

# using the apply_async() method
res = job.apply_async(args=[1, 2])
# and process the result as above, if you need to


A is provided. You know what to do with it.


The tests require nose, redis, redis-py and assume that the port 6389 is free.

Run the tests with “python test” or with “nosetests -v”.

This package was tested with python-2.7.6, python-3.3.4, nose-1.3.0, celery-3.1.10, redis-2.8.7 and redis-py-2.9.1 .


  • the module which holds your custom task will be reloaded. If it contains a class using ‘super’ and its instance, you might run into the problem described here. Apply one of the proposed fixes.
  • the state of the Celery daemon and its broker are checked only once, when the first .delay() or .apply_async() method is called on a custom task.

Release history Release notifications

This version


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for generic_celery_task, version 0.2
Filename, size File type Python version Upload date Hashes
Filename, size generic_celery_task-0.2.tar.gz (5.6 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page