概要
決まった時間や周期で何かタスクや関数を実行させたいときに使えるやつです。
環境
- macOS 10.13.3
requirements.txt
Django==2.0.4
celery==4.1.0
redis==2.10.6
requests==2.18.4
requests-oauthlib==0.8.0
datetime==4.2
上の3つが django と celery まわりで必要なやつ。下3つは bot (app) で使っただけ。
git のリポジトリ。
TedKoba/nem_bot
準備
こういうノリで整える
django-admin startproject nem_bot
cd nem_bot
virtualenv env
source env/bin/activate
python manage.py startapp bot
nem_bot/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'nem_bot.settings')
app = Celery('nem_bot',
broker='redis://localhost:6379/'
)
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
nem_bot/settings.py
from celery.schedules import crontab
INSTALLED_APPS = [
...,
'bot'
]
CELERYBEAT_SCHEDULE = {
'post-every-hour': {
'task': 'bot.tasks.tweet_nem_price',
'schedule': crontab(hour='*')
},
}
bot/tasks.py
from __future__ import absolute_import, unicode_literals
from nem_bot.celery import app
from bot.xem_bot import tweet_nem_price
@app.task
def scheduled_nem_bot():
tweet_nem_price()
実行
これで動く。
celery -A nem_bot worker -B -l info
成果物
NEM
— xem at zaif (@xem_price) 2018年4月25日
現在の価格: 44.6988
1時間前からの変動率: 2.54%
過去24時間の高値: 48.89
過去24時間の安値: 43.3
過去24時間の加重平均: 45.8582
課題
公式にあるやり方で実装しても bot/tasks.py
タスクが認識されてるのに呼び出されなかった。
Periodic Tasks
celery.py
from celery import Celery
from celery.schedules import crontab
app = Celery()
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# Calls test('hello') every 10 seconds.
sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')
# Calls test('world') every 30 seconds
sender.add_periodic_task(30.0, test.s('world'), expires=10)
# Executes every Monday morning at 7:30 a.m.
sender.add_periodic_task(
crontab(hour=7, minute=30, day_of_week=1),
test.s('Happy Mondays!'),
)
@app.task
def test(arg):
print(arg)
これだと sender.add_periodic_task()
で bot/tasks.py
の中のタスクが呼び出せなかったお話。もうちょっと調べてみる予定。