我必须安排任务在每个星期一到星期六运行。我下载了django-celery来完成任务。我按照Celery site上的教程进行操作,并使用并查看了一些堆栈溢出的帖子,例如:here和here
我与以上帖子以及这两个出色的教程:Rhatore和Freitas
进行了混搭。我被困了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进行部署。
答案 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,它现在很混乱。