芹菜不注册定期任务

时间:2018-12-03 11:28:21

标签: django python-3.x django-views django-celery celerybeat

我正在尝试运行celery worker,但是当我这样做时,Celery出于某种原因看不到我的定期任务。

这是我的控制台输出:

json_encode($php_array)

初始化 .py

------------- celery@andrey-MS-7996 v4.2.1 (windowlicker)
---- **** ----- 
--- * ***  * -- Linux-4.15.0-39-generic-x86_64-with-Ubuntu-18.04-bionic 2018-12-03 13:49:13
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         sjimalka:0x7fa69bef3e48
- ** ---------- .> transport:   redis://localhost:6379/0
- ** ---------- .> results:     redis://localhost:6379/
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]


[2018-12-03 13:49:13,380: INFO/Beat] beat: Starting...
[2018-12-03 13:49:13,385: INFO/MainProcess] Connected to redis://localhost:6379/0
[2018-12-03 13:49:13,392: INFO/MainProcess] mingle: searching for neighbors
[2018-12-03 13:49:14,409: INFO/MainProcess] mingle: all alone
[2018-12-03 13:49:14,432: WARNING/MainProcess] /home/andrey/.local/lib/python3.6/site-packages/celery/fixups/django.py:200: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
  warnings.warn('Using settings.DEBUG leads to a memory leak, never '
[2018-12-03 13:49:14,433: INFO/MainProcess] celery@andrey-MS-7996 ready.

celery.py

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

__all__ = ['celery_app']

settings.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from celery.schedules import crontab

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

app = Celery('sjimalka')

app.conf.timezone = 'Europe/Moscow'
app.config_from_object('django.conf:settings', namespace='CELERY')

app.autodiscover_tasks()

main.tasks.py

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/Moscow'
CELERY_BEAT_SCHEDULE = {
    'delete_old_foos': {
        'task': 'main.tasks.delete_old_foos',
        'schedule': crontab(minute=5)
    },
}

redis_host = os.environ.get('REDIS_HOST', 'localhost') 

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

Celery看不到delete_old_foos任务和其他任务,我只是不明白为什么。这是我的项目的结构:structure。我有两个星期没有接触该项目,然后一切正常。如果我只运行简单的celery-beat,它就可以正常工作。但是工人只是看不到任务,我还看不到任何错误。我用以下方法运行芹菜工人:

from celery import Celery
from celery.schedules import crontab
from celery.task import periodic_task
from django.utils import timezone
from main.models import image, imagenew, FtpPath
import os
from os import path as ospath
import datetime
from ftplib import FTP
from PIL import Image
from PIL import ImageFile
import shutil
import piexif
import cv2 as cv

app = Celery()

@periodic_task(run_every=crontab(minute='*/5'))
def delete_old_foos():
    imgs = image.objects.all()
    imgnews = imagenew.objects.all()

    for img in imgs:
        if img.delete_time < timezone.now() and img.deleted == False:
            image.objects.filter(pk=img.pk).update(deleted=True)
            try:
                os.remove('/home/andrey/sjimalka'+ img.image.url)
            except OSError:
                pass

    for imgnew in imgnews:
        if imgnew.delete_time < timezone.now() and imgnew.deleted == False:
            imagenew.objects.filter(pk=imgnew.pk).update(deleted=True)
            try:
                os.remove('/home/andrey/sjimalka'+ imgnew.image.url) 
            except OSError:
                pass

    shutil.rmtree('/home/andrey/sjimalka/media/archives/')
    os.chdir("/home/andrey/sjimalka/media/")
    os.mkdir('archives')

    return "completed deleting foos at {}".format(timezone.now())

0 个答案:

没有答案
相关问题