如何在Django设置中配置CELERYBEAT_SCHEDULE?

时间:2016-06-16 01:34:08

标签: python django celery periodic-task

我可以将它作为一个独立的应用程序运行,但是我无法让它在Django中运行。

以下是独立代码:

   `from celery import Celery
    from celery.schedules import crontab


    app = Celery('tasks')
    app.conf.update(
        CELERY_TASK_SERIALIZER='json',
        CELERY_RESULT_SERIALIZER='json',
        CELERY_ACCEPT_CONTENT=['json'],
        CELERY_TIMEZONE='US/Central',
        CELERY_ENABLE_UTC=True,
        CELERYBEAT_SCHEDULE = {
        'test': {
            'task': 'tasks.test',
            'schedule': crontab(),
            },
        }
    )

    @app.task
    def test():
        with open('test.txt', 'a') as f:
            f.write('Hello, World!\n')`

它为Rabbitmq服务器提供服务并每分钟写入文件。它就像一个魅力,但当我试图让它在Django中工作时,我得到了这个错误:

  
    

您记得导入包含此任务的模块吗?或者你可能正在使用相对进口?请参阅____了解     更多信息。

  
     

邮件正文的全部内容是:{'retries':0,'eta':无,   'kwargs':{},'taskset':无,'timelimit':[无,无],'回调':   没有,'任务':'proj.test','args':[],'expires':无,'id':   '501ca998-b5eb-4ba4-98a8-afabda9e88dd','utc':是的,'错误':没有,   'chord':无}(246b)回溯(最近一次调用最后一次):文件   “/home/user/CeleryDjango/venv/lib/python3.5/site-packages/celery/worker/consumer.py”   第456行,在on_task_received中       策略[名称](消息,正文,KeyError:'proj.test'[2016-06-16 01:16:00,051:INFO / Beat]调度程序:发送到期任务测试(proj.test)   [2016-06-16 01:16:00,055:ERROR / MainProcess]收到未注册   'proj.test'类型的任务。

这是我在Django中的代码:

# CELERY STUFF
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'US/Central'
CELERYBEAT_SCHEDULE = {
    'test': {
        'task': 'proj.test',
        'schedule': crontab(),
    }
}

celery.py

from __future__ import absolute_import

import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
from django.conf import settings  # noqa

app = Celery('proj')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

task.py

from __future__ import absolute_import
from celery import shared_task


@shared_task
def test():
    with open('test.txt', 'w') as f:
        print('Hello, World', file=f)

init.py

from __future__ import absolute_import

from .celery import app as celery_app 

对此的任何想法都非常感谢。感谢。

1 个答案:

答案 0 :(得分:9)

为什么不尝试以下内容,让我知道它是否适合你。它对我有用。

在settings.py中

CELERYBEAT_SCHEDULE = {
    'my_scheduled_job': {
        'task': 'run_scheduled_jobs', # the same goes in the task name
        'schedule': crontab(),
    },
}

在tasks.py ..

from celery.task import task # notice the import of task and not shared task. 

@task(name='run_scheduled_jobs') # task name found! celery will do its job
def run_scheduled_jobs():
    # do whatever stuff you do
    return True

但是如果你正在寻找shared_task那么..

@shared_task(name='my_shared_task') # name helps celery identify the functions it has to run
def my_shared_task():
    # do what you want here..
    return True

我使用共享任务进行异步作业..所以我需要从以下函数中调用它。

在项目应用中的views.py /或anywhere.py中

def some_function():
    my_shared_task.apply_async(countdown= in_seconds)
    return True

如果您忘记了,请记住包含您尝试运行任务的应用程序..

INSTALLED_APPS = [...
 'my_app'...
] # include app

我确定这种方法运行正常..谢谢