Сельдерей периодическое задание непериодическое - PullRequest
0 голосов
/ 04 июня 2019

Я пытался создать задачу, которая должна запускаться каждую минуту в сельдерее вместе с сервером redis

Для выполнения redis я запустил "redis-server"

Для выполнения сельдерея я бегал "celery -A tasks worker --loglevel=info"

Это мой файл tasks.py

from celery import Celery
from celery.schedules import crontab
from celery.task import periodic_task

app = Celery('tasks', backend='redis://localhost', broker='redis://localhost')


@app.task
def add(x, y):
    return x + y

@periodic_task(run_every=(crontab(minute='1')),name="run_every_minute",ignore_result=True)
def run_every_minute():
    print("hehe")
    return "ok"

Когда я бегал в консоли Python

from tasks.py import run_every_minute
z=run_every_minute.delay()

Я получил вывод на терминале с работающим сельдереем как

[2019-06-05 01:35:02,591: INFO/MainProcess] Received task: run_every_minute[06498b4b-1d13-45af-b91c-fb10476e0aa3]
[2019-06-05 01:35:02,595: WARNING/Worker-2] hehe 
[2019-06-05 01:35:02,599: INFO/MainProcess] Task run_every_minute[06498b4b-1d13-45af-b91c-fb10476e0aa3] succeeded in
    0.004713802001788281s: 'ok'

Но это должно выполняться каждую минуту, поскольку это периодическая задача. Как это может случиться Кроме того, как мы можем выполнить задачу сельдерея в определенное время, скажем, 5:30 по Гринвичу (например).

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Хорошо, на основании комментария

Сначала необходимо запустить планировщик / такт periodic_task ( Периодические задачи ), при этом планировщик отправит задачу в зависимости от run_every параметр

celery -A tasks beat

Далее, если вам нужно посылать удар каждую минуту, вам нужен crontab следующим образом

@periodic_task(run_every=(crontab(minute='*')),name="run_every_minute",ignore_result=True)
def run_every_minute():
    print("hehe")
    return "ok"

С minute='*' будетотправлять задание каждую минуту.minute=1 будет отправлять задание каждый час в минуту

1 голос
/ 05 июня 2019

Отвечая на ваш последний комментарий:

run_every=(crontab(minute='1'))

Вы указали 'минута часа' = 1, поэтому при выполнении удара сельдерея ваше периодическое задание запускается каждый час в минуту '1', например, 00:01, 01:01 и т. Д.

Вы должны установить атрибут hour для своего crontab, вероятно, как диапазон

...