2016-11-28 3 views
1

В неразрывности с вопросом: celery periodic tasks not executingДжанго сельдерей Полученное незарегистрированный задачу типа 'print_test'

Я настроил Джанго с сельдереем, как:

drf_project/drf_project/celery.py

from __future__ import absolute_import, unicode_literals 
from celery import Celery 
import os 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drf_project.settings') 
app = Celery('drf_project') 
app.config_from_object('django.conf:settings', namespace='CELERY') 
app.autodiscover_tasks() 

В drf_project/drf_project/init.py

from __future__ import absolute_import, unicode_literals 
from .celery import app as celery_app 

__all__ = ['celery_app'] 

drf_project /user_management/tasks.py

from drf_project.celery import app 
from time import strftime 

@app.task 
def print_test(): 
    print strftime('%Y-%m-%d %H:%M:%S') 
    with open('abc.txt', 'ab+') as test_file: 
     test_file.writeline(strftime('%Y-%m-%d %H:%M:%S')) 

В drf_project/drf_project/settings.py

INSTALLED_APPS += ('django_celery_beat',) 
CELERYBEAT_SCHEDULE = { 
    "test_1": { 
     "task": "tasks.print_test", 
     "schedule": timedelta(seconds=2), 
    }, 
} 

Я побежал как сельдерей работника и бить в разных терминалах с командами:

celery -A drf_project worker -l info -E 

и

celery -A drf_project beat -l info -S django 

Удар посылает задания на рабочий каждые 2 секунды, как:

[2016-11-28 12:25:19,314: INFO/MainProcess] Scheduler: Sending due task Importing contacts (print_test)

Но работник бросает ошибку, как:

[2016-11-28 12:24:57,551: ERROR/MainProcess] Received unregistered task of type 'print_test'. The message has been ignored and discarded.

Did you remember to import the module containing this task? Or maybe you're using relative imports?

Please see http://docs.celeryq.org/en/latest/internals/protocol.html for more information.

The full contents of the message body was: u'[[], {}, {"chord": null, "callbacks": null, "errbacks": null, "chain": null}]' (77b) Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer/consumer.py", line 549, in on_task_received strategy = strategies[type_] KeyError: 'print_test'

Я вижу задачу в моем рабочем приложении как:

[tasks] 
    . user_management.tasks.print_test 

Как решить эту ошибку?

ответ

0

установка Try в CELERYBEAT_SCHEDULE абсолютный путь задачи, "user_management.tasks.print_test"

Он должен выглядеть следующим образом:

INSTALLED_APPS += ('django_celery_beat',) 
CELERYBEAT_SCHEDULE = { 
    "test_1": { 
     "task": "user_management.tasks.print_test", 
     "schedule": timedelta(seconds=2), 
    }, 
} 
+0

Я попробовал все. от '' user_management.tasks.print_test ''до' "drf_project.user_management.tasks.print_test" '. Если я использую любой из этих двух вариантов, я не могу видеть, что моя задача указана в рабочем состоянии. Он отображается только в рабочем месте, если я выбираю 'tasks.print_test' –

+0

В CELERYBEAT_SCHEDULE задача должна быть вызвана, как она появляется в списке задач сельдерея. – EmilioK

+0

Попробуйте составить список всех задач и поиск ваша, >>> из приложения импорта proj.celery >>> app.tasks { 'celery.chord_unlock': <@task: celery.chord_unlock>, 'celery.backend_cleanup' : <@task: celery.backend_cleanup>, 'celery.chord': <@task: celery.chord>} – EmilioK

Смежные вопросы