I'm trying to run celerybeat on a method task, and can't get anything to work out properly. Here's an example setup:
from celery.contrib.methods import task_method
from celery import Celery, current_app
celery=celery('tasks', broker='amqp://guest@localhost//')
celery.config_from_object("celeryconfig")
class X(object):
@celery.task(filter=task_method, name="X.ppp")
def ppp(self):
print "ppp"
and my celeryconfig.py file is
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
'test' : {
'task' : 'X.ppp',
'schedule' : timedelta(seconds=5)
},
}
When I run celery beat
, I'm getting errors like:
task X.ppp raised exception, TypeError('ppp() takes exactly 1 argument, (0 given)
When I turn the method into a normal function and decorate it with `@celery.task', it does work, so the rest of the setup seems to be working. I see the caveats in the docs about method tasks, but can't really sort out where the problem is. Does anyone know how to resolve this?
The problem is that Celerybeat will not instantiate X before calling the method. The task_method filter defaults to calling the unbound method if the method is not bound to an object.
My question is, what are you trying to accomplish here? X has no state, so why not use a module-evel function?