【问题标题】:why my celery task is not executing periodically?为什么我的芹菜任务没有定期执行?
【发布时间】:2020-11-03 09:36:01
【问题描述】:

我有一个 celery 周期性任务,但该任务仅在我运行 celery worker 或运行 celery beat 时运行。我已将任务配置为在 django settings.py 文件中每 20 分钟运行一次,但在我检查 20 分钟后,芹菜工人没有收到任何任务。

celery beat 控制台

celery beat v4.4.4 (cliffs) is starting.
__    -    ... __   -        _
LocalTime -> 2020-07-16 12:10:18
Configuration ->
    . broker -> amqp://guest:**@localhost:5672//
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> celery.beat.PersistentScheduler
    . db -> celerybeat-schedule
    . logfile -> [stderr]@%INFO
    . maxinterval -> 5.00 minutes (300s)
[2020-07-16 12:10:18,835: INFO/MainProcess] beat: Starting...

当我退出这个节拍并再次重新启动时,芹菜工人会立即收到任务并执行。

我希望 celery worker 每 20 分钟定期接收和执行任务。我该怎么做?

我在两个不同的控制台中运行 celery worker 和 celery beat。 我使用了命令 celery -A myproj worker -l info 工人 celery -A myproj beat -l info --pidfile= 拍拍

tasks.py

app = Celery('myproj')
@app.task
def schedule_task():
    running_tasks = Task.objects.filter(Q(status=0) | Q(status=1))
    print(running_tasks)
    for task in running_tasks:
        unique_id = task.unique_id
        keywords = task.keywords.all()
        if task.scraping_end_date > timezone.now().date():
            settings = {
                'spider_count': len(task.targets.all()),
                'keywords': keywords,
                'scraping_end': task.scraping_end_date,
                'unique_id': unique_id,  # unique ID for each record for DB
                'USER_AGENT': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'
            }

            for site_url in task.targets.all():
                domain = urlparse(site_url.domain).netloc
                spider_name = domain.replace('.com', '')
                task = scrapyd.schedule('default', spider_name, settings=settings,
                                        url=site_url.domain, domain=domain, keywords=keywords)
              
        else:
            task.status = 2
            task.save()

settings.py

CELERY_BROKER_URL = 'amqp://localhost'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERYBEAT_SCHEDULE = {
'crawl_sites': {
    'task': 'crawler.tasks.schedule_task',
    'schedule': crontab(minute='*/20'),
},

}

【问题讨论】:

  • 你如何运行它?将-B 参数传递给芹菜节拍
  • 启动worker,一键通关,设置日志级别为调试,既然你使用django,试试celery -A myproj worker --beat --loglevel=debug --scheduler django_celery_beat.schedulers:DatabaseScheduler

标签: django django-views celery django-celery


【解决方案1】:

换行

'schedule': crontab(minute=20),

'schedule': crontab(minute='*/20'),

同时重启 celery beat。

【讨论】:

  • 没有用。是否还有其他可能遗漏的东西?
  • 我每次都需要重启 celery beat,然后只有 celery worker 接收任务并执行。为什么会这样?
猜你喜欢
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2021-12-16
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多