Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Celery beat with method tasks not working

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?

like image 976
reptilicus Avatar asked May 06 '26 15:05

reptilicus


1 Answers

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?

like image 161
Loren Abrams Avatar answered May 08 '26 04:05

Loren Abrams