Django-Celery安排日常任务

时间:2019-02-15 21:57:30

标签: django rabbitmq celery

我必须安排任务在每个星期一到星期六运行。我下载了django-celery来完成任务。我按照Celery site上的教程进行操作,并使用并查看了一些堆栈溢出的帖子,例如:herehere

我与以上帖子以及这两个出色的教程:RhatoreFreitas

进行了混搭。

我被困了8个多小时,我想我已经尽我所能了。任何帮助将不胜感激。我下载了RabbitMQ。

这是我的文件夹结构:

Application
    | apps
         | app1
              | __init__.py
              | tasks.py
              | urls.py
              | views.py    
    | Application
         | __init__.py
         | celery.py
         | settings.py
         | urls.py
         | wsgi.py

Settings.py

INSTALLED_APPS = [
    'django_celery_beat',
    'apps.app1',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True    
USE_TZ = True

CELERY_BROKER_URL = 'amqp://localhost'
CELERY_RESULT_BACKEND = 'amqp://localhost'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'UTC'

__ init __。py 在应用程序下的 init

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

from .celery import app as celery_app

    __all__ = ('celery_app',)

celery.py

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

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Application.settings')

app = Celery('Application')

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

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

tasks.py -为简单起见,我将任务简化为简单的打印命令

from celery import shared_task
from celery.utils.log import get_task_logger
from celery.schedules import crontab
from celery.task import periodic_task
from celeryapp.emails import send_feedback_email
from django.http import HttpResponse
from .models import *

logger=get_task_logger(__name__)

@periodic_task(run_every=crontab(hour=21, minute=32, day_of_week=0-5))
def simple_print():
    print("Hello World!")

我跑了

celery -A Application -1 info

然后是python manage.py runserver  21:32 UTC通过,并且没有打印。我希望按照task.py中指定的任务在终端的世界标准时间21:32看到“ Hello World”。它没有打印。我还有另一个功能要运行,但是为了简单起见,我只是想先进行打印。

我也跑了

celery -A Application worker -l info
celery -A Application beat -l info
python manage.py runserver

在不同的终端。它没有执行任务。

指导将不胜感激。而且,如果您还可以告诉我该如何部署,那也很好。我已经阅读过有关守护程序或主管的信息,但由于花了很多时间,所以我现在甚至无法完成简单的打印。我使用Apache 2.4进行部署。

2 个答案:

答案 0 :(得分:1)

您需要同时运行工人和拍子,以便芹菜知道它是否必须在特定时间执行定期任务。

这样的事情应该会在您的本地环境中为您提供帮助。

celery -A Application worker -l info -B

或者,您可以将两个工作人员作为单独的服务开始

celery -A Application worker -l info

celery -A Application beat -l info

答案 1 :(得分:0)

代码正确。问题是由于操作系统。我正在使用Windows,而Celery 4.0不支持Windows。这个问题非常有用:How to Run Celery on Windows。我安装了gevent,它现在很混乱。