【问题标题】:Scheduling Django method with Celery用 Celery 调度 Django 方法
【发布时间】:2019-01-13 12:58:40
【问题描述】:

我有这个方法:

def getExchangeRates(): 
    """ Here we have the function that will retrieve the latest rates from fixer.io """
    rates = {}
    response = urlopen('http://data.fixer.io/api/latest?access_key=c2f5070ad78b0748111281f6475c0bdd')
    data = response.read()
    rdata = json.loads(data.decode(), parse_float=float) 
    rates_from_rdata = rdata.get('rates', {})
    for rate_symbol in ['USD', 'GBP', 'HKD', 'AUD', 'JPY', 'SEK', 'NOK']:
        try:
            rates[rate_symbol] = rates_from_rdata[rate_symbol]
        except KeyError:
            logging.warning('rate for {} not found in rdata'.format(rate_symbol)) 
            pass
    return rates

@require_http_methods(['GET', 'POST'])
def index(request):
    rates = getExchangeRates()
    fixerio_rates = [Fixerio_rates(currency=currency, rate=rate)
                 for currency, rate in rates.items()]
    Fixerio_rates.objects.bulk_create(fixerio_rates)
    return render(request, 'index.html') 

我想安排这个,比如说,每天早上 9 点,周末除外。

我还没有找到一些关于如何根据这样一个特定的日期时间安排这个的综合教程,而且我不知道我是否可以安排这个方法,或者在我的tasks 文件中创建另一个继承这个的方法一个,并在任何特定日期运行。

我的项目根目录中有celery.py 文件,我的应用文件夹中有tasks.py 文件。

或者,也许芹菜不适合这种情况?

有什么想法吗?

【问题讨论】:

  • 首先:你不需要 celery,你的操作系统已经有一个调度器。第二;创建/更新模型的 ciode 应该存在于管理命令中(如果您决定使用操作系统调度程序)或 celery 任务(如果您真的想为此使用 celery),而不是在视图中。最后:GET 请求必须是幂等的(必须注意更改服务器的状态)。

标签: python django celery


【解决方案1】:

有一些 django 软件包可让您使用 django 管理界面管理“类似 cron”的作业。我过去使用过 django-chronograph 和 django-chroniker (https://github.com/chrisspen/django-chroniker)。还有 django-cron (https://django-cron.readthedocs.io/en/latest/installation.html),不过我没用过。

它们都有类似的方法:您在 crontab 上创建一个条目,每分钟运行类似 python manage.py runcrons 的内容,然后在您的 settings.py 上添加包以在管理员上显示。

查看 Chroniker 或 Django-cron 的文档以获取有关如何设置的更多信息。

【讨论】:

  • 谢谢,django_cron 看起来不错
【解决方案2】:

另外,您可以使用Celery Beat 来安排您需要的任务。

【讨论】:

    【解决方案3】:

    可以使用Celery Beat 安排任务。

    Celery Beat 必须作为另一个进程启动。这个beat 进程会将计划任务踢到celery worker process,这将像任何其他 celery 异步任务一样启动任务。要或询问这两个过程通常是一个好主意,在生产中使用supervisord,在开发中使用honcho

    计划任务可以在代码中定义,也可以存储在数据库中并通过扩展名为django-celery-beat的django-admin处理

    要通过代码添加它,最简单的方法是在tasks.py 文件中创建另一个方法。对于您每天早上 9 点的要求,除了周末“它可能看起来像这样”

    @app.on_after_configure.connect
    def setup_periodic_tasks(sender, **kwargs):
    
        # Executes every Monday morning at 9 a.m.
        sender.add_periodic_task(
            crontab(hour=9, minute=0, day_of_week=1),
            test.s('Happy Mondays!'),
        )
        sender.add_periodic_task(
            crontab(hour=9, minute=0, day_of_week=2),
            test.s('Happy Tuesday!'),
        )
        sender.add_periodic_task(
            crontab(hour=9, minute=0, day_of_week=3),
            test.s('Happy Wednesday!'),
        )
        sender.add_periodic_task(
            crontab(hour=9, minute=0, day_of_week=4),
            test.s('Happy Thursday!'),
        )
        sender.add_periodic_task(
            crontab(hour=9, minute=0, day_of_week=1),
            test.s('Happy Friday!'),
        )
    
    @app.task
    def test(arg):
        print(arg)
    

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 2013-08-30
      • 2018-05-03
      • 1970-01-01
      • 2015-09-04
      • 2013-07-05
      • 2011-11-14
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多