Celery 四 定時任務

2021-09-08 13:48:27 字數 2911 閱讀 7541

要定時或者週期性的執行任務,可以使用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...