使用Celery调度Django方法

时间:2019-01-13 12:58:40

标签: python django celery

我有这种方法:

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文件。

或者,也许芹菜不是解决这种情况的方法吗?

有什么想法吗?

3 个答案:

答案 0 :(得分: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上添加该软件包以在admin上显示。

请参阅Chroniker或Django-cron的文档,以获取有关如何进行设置的更多信息。

答案 1 :(得分:1)

此外,您可以使用Celery Beat安排所需的任务。

答案 2 :(得分:1)

可以使用Celery Beat安排任务。

Celery Beat必须作为另一个过程启动。此beat过程会将排定的任务踢向celery worker process,这将像其他所有celery异步任务一样启动任务。通常,对这两个过程进行求和是一个好主意,在生产中使用supervisord,在开发中使用honcho

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

要通过代码添加它,最简单的方法是在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)