要定時或者週期性的執行任務,可以使用linux的crontab。celery也提供了類似的periodic tasks功能。
celery使用celery beat作為任務排程器,週期性的啟動任務。
需要執行的任務預設是在beat_schedule配置選項中設定的。使用django-celery-beat時,也可以使用資料庫儲存。
需要保證同一時間只有乙個任務排程器在執行,否則會重複的執行任務。
既然是任務與時間有關,那麼時區設定是很重要的。celery預設使用utc時區,要改變預設時區,可以配置:
timezone = asia/shanghai'
在django專案中使用celery時,celery也可以使用setting的time_zone時區設定。
使用預設的任務排程器時,celery會自動識別時區的改動,然後重置任務排程。使用其它任務排程時,需要手動重置。
比如,使用django-celery-beat時:
$ python manage.py shell
>>> from djcelery.models import periodictask
>>> periodictask.objects.update(last_run_at=none)
要新增週期任務,需要將事務新增到任務排程器中,新增方法有兩種。
一種是使用add_periodic_task() 方法:
from __future__ import absolute_import, unicode_literals
from celery.schedules import crontab
def setup_periodic_tasks(sender, **kwargs):
# calls add(1, 2) every 10 seconds.
sender.add_periodic_task(10.0, add.s(1, 2), name='add every 10')
# calls add(3, 4) every 30 seconds
sender.add_periodic_task(30.0, add.s(3, 4), )
# executes every monday morning at 7:30 a.m.
sender.add_periodic_task(
┆ crontab(hour=7, minute=30, day_of_week=1),
┆ add.s(1, 2),
)def add(x, y):
print x + y
return x + y
另一種方法是配置beat_schedule選項:
'add-every-30-seconds': ,}
可用字段:
task:需要執行的任務名稱
schedule:任務執行時間設定,可以是整秒數,乙個timedelta物件,或者乙個crontab物件,也可以自己實現。
args:乙個元組或者列表,位置引數
kwargs:乙個字典,關鍵字引數
relative:預設false
class celery.schedules.crontab(minute=u'*', hour=u'*', day_of_week=u'*', day_of_month=u'*', month_of_year=u'*', **kwargs)
乙個表示時間間隔的物件,語法與linux的crontab類似。
minute和hour可以設定為*/15,*/2,分別表示每隔15分鐘和每隔2小時。
day_of_week用可以0-6的數字表示,也可以文字表示mon-fri。*/2並不是每2天,而是每半天。
官網一些具體例子:
crontab() 每分鐘
crontab(minute=0, hour=0) 每天的0時0分
crontab(minute=0, hour='*/3') 每三小時
crontab(day_of_week='sunday') 週日的每一小時
crontab(minute='*',hour='*', day_of_week='sun') 與上面相同
crontab(minute=0, hour='*/3,8-17') 每三個小時 8時到17時的每小時
可用日公升日落表示的時間間隔:
from celery.schedules import solar
# executes at sunset in melbourne
'add-at-melbourne-sunset': ,
}
語法是solar(event, latitude, longitude)
event表示日落日出,latitude為緯度,北緯為+,longitude為經度,東經為+。
啟動celery beat週期任務命令:
$ celery -a proj beat
然後啟動worker節點來處理任務即可。
beat與worker也可以同時啟動,但最好只用於測試,適用於只啟動乙個worker節點的情況:
$ celery -a proj worker -b
beat會在當前目錄下建立乙個檔案celerybeat-schedule來記錄任務上次執行的時間,所以要保證celery對當前目錄有寫入的許可權,或者指定檔案位置:
$ celery -a proj beat -s /home/celery/var/run/celerybeat-schedule
Celery 定時任務
project celery task celery包 init py 包檔案 celery.py celery連線和配置相關檔案,且名字必須交celery.py tasks.py 任務體函式檔案 注意 任務體 檔案要與celery.py檔案在同乙個包下 beat也是乙個socket,啟動後會根據配...
Celery 定時任務
celery beat是乙個排程程式,它定期啟動任務,然後由集群中的可用工作程式節點執行任務。預設情況下,條目是從 beat schedule 設定中獲取的 但也可以使用自定義儲存,例如將條目儲存在sql資料庫中。必須確保一次只有乙個排程程式針對乙個排程任務執行,否則最終將導致重複的任務。使用集中式...
celery定時任務
預先在django中配置好celery,接下來著手配置下定時任務。時區修改為本地時區 在setttings.py 新增以下任意一行 celery timezone asia shanghai 如果使用了django celery beat持久化到資料庫,那麼需要手動執行更新命令 python man...