如何解决Django Celery Beat在Celery中执行Django中的定期任务无法正常工作
我想将芹菜添加到我的django项目中。但是,尽管我遵循了官方文档中的步骤,但是它似乎无法按预期工作。 这是我的Django项目的一部分:
.crt
然后初始化文件:
# celery.py
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE','bookProjectSetting.settings')
app = Celery('bookProjectSetting')
app.config_from_object('django.conf:settings',namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
app.conf.beat_schedule = {
'update-lifetime': {
'task': 'tasks.update_life_time_of_books','schedule': crontab(minute='*/5'),},}
现在,在我的应用文件夹(名为# __init__.py
from .celery import app as celery_app
__all__ = ('celery_app',)
)中,books
如下所示:
tasks.py
在我的from books.models import Book
from celery import shared_task
@shared_task
def update_life_time_of_books():
# Query all the books in our database
print("Query all books.")
books = Book.objects.all()
# do sth. with books. for the sake of brevity I do not show this
文件中,有这个用于芹菜:
settings.py
我通过CELERY_broKER_URL = 'redis://localhost:6379'
CELERY_TIMEZONE = 'Europe/Berlin'
# ... bla bla
INSTALLED_APPS = [
'django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','django_celery_beat','rest_framework','books',]
命令在第二个选项卡中启动了Redis服务器,以便它可以充当代理。我还通过redis-server
启动了django服务器。
最后,我通过以下命令启动了工作程序:
python manage.py runserver
但是结果我得到了:
celery -A bookProjectSetting beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
因此,似乎任务是在5分钟后发送的,就像我在celery beat v5.0.1 (singularity) is starting.
__ - ... __ - _
LocalTime -> 2020-10-23 13:56:29
Configuration ->
. broker -> redis://localhost:6379//
. loader -> celery.loaders.app.AppLoader
. scheduler -> django_celery_beat.schedulers.DatabaseScheduler
. logfile -> [stderr]@%INFO
. maxinterval -> 5.00 seconds (5s)
[2020-10-23 13:56:29,666: INFO/MainProcess] beat: Starting...
[2020-10-23 14:00:00,021: INFO/MainProcess] Scheduler: Sending due task update-lifetime (tasks.update_life_time_of_books)
中通过crontab声明的那样(请参见上文),但是例如,我的任务功能(见上文)中的celery.py
却没有发送被执行。因此,我假设我的任务没有执行。为什么???我必须说,官方文档中没有明确的示例,我发现的材料/文章仅适用于芹菜3或4。我正在使用芹菜5。
我在这里使用的库的版本如下:
- 芹菜== 5.0.1
- Django == 3.1.2
- django-celery-beat == 2.1.0
- redis == 3.5.3
我的django项目文件夹结构如下:
print("Query all books.")
解决方法
celery -A bookProjectSetting worker -l info
和
celery -A bookProjectSetting beat -l INFO
需要同时启动。然后,您可以观察您的任务是否正常运行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。