【问题标题】:Why does Celery periodic tasks fire a function only once为什么芹菜周期性任务只触发一次功能
【发布时间】:2020-05-20 00:39:37
【问题描述】:

我已经构建了一个小型网络爬虫功能,用于从网络获取一些数据并将其填充到我的数据库中,效果很好。 现在我想使用 Celery 定期任务每 20 秒定期触发此功能。 我浏览了文档,一切似乎都已准备好进行开发(使用 redis 作为代理)。

这是我在 project/stocksapp 中的 tasks.py 文件,其中我定期触发的函数是:

# Celery imports

from celery.task.schedules import crontab
from celery.decorators import periodic_task
from celery.utils.log import get_task_logger
from datetime import timedelta

logger = get_task_logger(__name__)

# periodic functions

@periodic_task(
    run_every=(timedelta(seconds=20)),
    name="getStocksDataDax",
    ignore_result=True
)
def getStocksDataDax():
    print("fired")

现在,当我启动 worker 时,该函数似乎只被触发一次(数据库被填充)。但在那之后,该函数不再被触发,尽管控制台建议这样做:

C:\Users\Jonas\Desktop\CFD\CFD>celery -A CFD beat -l info
celery beat v4.4.2 (cliffs) is starting.
__    -    ... __   -        _
LocalTime -> 2020-05-15 23:06:29
Configuration ->
    . broker -> redis://localhost:6379/0
    . loader -> celery.loaders.app.AppLoader
    . scheduler -> celery.beat.PersistentScheduler
    . db -> celerybeat-schedule
    . logfile -> [stderr]@%INFO
    . maxinterval -> 5.00 minutes (300s)
[2020-05-15 23:06:29,990: INFO/MainProcess] beat: Starting...

[2020-05-15 23:06:30,024: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)
[2020-05-15 23:06:50,015: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)
[2020-05-15 23:07:10,015: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)
[2020-05-15 23:07:30,015: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)
[2020-05-15 23:07:50,015: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)
[2020-05-15 23:08:10,016: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)
[2020-05-15 23:08:30,016: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)
[2020-05-15 23:08:50,016: INFO/MainProcess] Scheduler: Sending due task getStocksDataDax (getStocksDataDax)

项目/项目/celery.py

from __future__ import absolute_import, unicode_literals

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'CFD.settings')

app = Celery('CFD',
             broker='redis://localhost:6379/0',
             backend='amqp://',
             include=['CFD.tasks'])

app.conf.broker_transport_options = {'visibility_timeout': 3600}
# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

函数本身总共运行大约 1 秒。

在这个设置中,让工作人员/芹菜按预期每 20 秒触发一次功能基本上可能存在问题?

【问题讨论】:

  • 从这里看到的 beat 正在正确创建任务,你是否也用 beat 运行了工作进程?您问题中的任务也没有任何代码

标签: python django celery


【解决方案1】:

celery -A CFD beat -l info 仅启动 Celery beat 过程。你应该有一个单独的 Celery 工作进程 - 在不同的终端中运行类似 celery -A CFD worker -c 8 -O fair -l info 的东西。

【讨论】:

    猜你喜欢
    • 2018-03-11
    • 1970-01-01
    • 2015-04-11
    • 2018-04-05
    • 1970-01-01
    • 2019-02-19
    • 2016-08-18
    • 2014-02-11
    • 2019-02-20
    相关资源
    最近更新 更多