国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

celery4+django2定時任務的實現代碼

2020-01-04 13:44:20
字體:
來源:轉載
供稿:網友

網上有很多celery + django實現定時任務的教程,不過它們大多數是基于djcelery + celery3的;

或者是使用django_celery_beat配置較為繁瑣的。

顯然簡潔而高效才是我們最終的追求,而celery4已經不需要額外插件即可與django結合實現定時任務了,原生的celery beat就可以很好的實現定時任務功能。

當然使用原生方案的同時有幾點插件所帶來的好處被我們放棄了:

  • 插件提供的定時任務管理將不在可用,當我們只需要任務定期執行而不需要人為調度的時候這點忽略不計。
  • 無法高效的管理或追蹤定時任務,定時任務的跟蹤其實交給日志更合理,但是對任務的修改就沒有那么方便了,不過如果不需要經常變更/增減任務的話這點也在可接受范圍內。

Celery定時任務配置

在進行配置前先來看看項目結構:

.├── linux_news│  ├── celery.py│  ├── __init__.py│  ├── settings.py│  ├── urls.py│  └── wsgi.py├── manage.py├── news│  ├── admin.py│  ├── apps.py│  ├── __init__.py│  ├── migrations│  ├── models│  ├── tasks.py│  ├── tests.py│  └── views└── start-celery.sh

其中news是我們的app,用于從一些rss訂閱源獲取新聞信息,linux_news則是我們的project。我們需要關心的主要是 celery.py , settings.py , tasks.py 和 start-celery.sh 

首先是celery.py,想讓celery執行任務就必須實例化一個celery app,并把settings.py里的配置傳入app:

import osfrom celery import Celery# set the default Django settings module for the 'celery' program.os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'linux_news.settings')app = Celery('linux_news')# 'django.conf:settings'表示django,conf.settings也就是django項目的配置,celery會根據前面設置的環境變量自動查找并導入# - namespace表示在settings.py中celery配置項的名字的統一前綴,這里是'CELERY_',配置項的名字也需要大寫app.config_from_object('django.conf:settings', namespace='CELERY')# Load task modules from all registered Django app configs.app.autodiscover_tasks()

配置就是這么簡單,為了能在django里使用這個app,我們需要在__init__.py中導入它:

from .celery import app as celery_app

然后我們來看tasks.py,它應該位于你的app目錄中,前面我們配置了自動發現,所以celery會自動找到這些tasks,我們的tasks將寫在這一模塊中,代碼涉及了一些orm的使用,為了契合主題我做了些精簡:

from linux_news.celery import celery_app as appfrom .models import *import timeimport feedparserimport pytzimport html@app.task(ignore_result=True)def fetch_news(origin_name):  """  fetch all news from origin_name  """  origin = get_feeds_origin(origin_name)  feeds = feedparser.parse(origin.feed_link)  for item in feeds['entries']:    entry = NewsEntry()    entry.title = item.title    entry.origin = origin    entry.author = item.author    entry.link = item.link    # add timezone    entry.publish_time = item.time.replace(tzinfo=pytz.utc)    entry.summary = html.escape(item.summary)    entry.save()@app.task(ignore_result=True)def fetch_all_news():  """  這是我們的定時任務  fetch all origins' news to db  """  origins = NewsOrigin.objects.all()  for origin in origins:    fetch_news.delay(origin.origin_name)

tasks里是一些耗時操作,比如網絡IO或者數據庫讀寫,因為我們不關心任務的返回值,所以使用 @app.task(ignore_result=True) 將其屏蔽了。

任務配置完成后我們就要配置celery了,我們選擇redis作為任務隊列,我強烈建議在生產環境中使用rabbitmq或者redis作為任務隊列或結果緩存后端,而不應該使用關系型數據庫:

# redisREDIS_PORT = 6379REDIS_DB = 0# 從環境變量中取得redis服務器地址REDIS_HOST = os.environ.get('REDIS_ADDR', 'redis')# celery settings# 這兩項必須設置,否則不能正常啟動celery beatCELERY_ENABLE_UTC = TrueCELERY_TIMEZONE = TIME_ZONE# 任務隊列配置CELERY_BROKER_URL = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}'CELERY_ACCEPT_CONTENT = ['application/json', ]CELERY_RESULT_BACKEND = f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}'CELERY_TASK_SERIALIZER = 'json'

然后是我們的定時任務設置:

from celery.schedules import crontabCELERY_BEAT_SCHEDULE={    'fetch_news_every-1-hour': {      'task': 'news.tasks.fetch_all_news',      'schedule': crontab(minute=0, hour='*/1'),    }}

定時任務配置對象是一個dict,由任務名和配置項組成,主要配置想如下:

  • task:任務函數所在的模塊,模塊路徑得寫全,否則找不到將無法運行該任務
  • schedule:定時策略,一般使用 celery.schedules.crontab ,上面例子為每小時的0分執行一次任務,具體寫法與linux的crontab類似可以參考文檔說明
  • args:是個元組,給出任務需要的參數,如果不需要參數也可以不寫進配置,就像例子中的一樣
  • 其余配置項較少用,可以參考文檔

至此,配置celery beat的部分就結束了。

啟動celery beat

配置完成后只需要啟動celery了。

啟動之前配置一下環境。不要用root運行celery!不要用root運行celery!不要用root運行celery!重要的事情說三遍。

start-celery.sh:

export REDIS_ADDR=127.0.0.1celery -A linux_news worker -l info -B -f /path/to/log

-A 表示app所在的目錄,-B表示啟動celery beat運行定時任務。

celery正常啟動后就可以通過日志來查看任務是否正常運行了:

[2018-12-21 13:00:00,022: INFO/MainProcess] Received task: news.tasks.fetch_all_news[e4566ede-2cfa-4c19-b2f3-0c7d6c38690d]  
[2018-12-21 13:00:00,046: INFO/MainProcess] Received task: news.tasks.fetch_news[583e96dc-f508-49fa-a24a-331e0c07a86b]  
[2018-12-21 13:00:00,051: INFO/ForkPoolWorker-2] Task news.tasks.fetch_all_news[e4566ede-2cfa-4c19-b2f3-0c7d6c38690d] succeeded in 0.02503809699555859s: None
[2018-12-21 13:00:00,052: INFO/MainProcess] Received task: news.tasks.fetch_news[c61a3e55-dd3c-4d49-8d6d-ca9b1757db25]  
[2018-12-21 13:00:00,449: INFO/ForkPoolWorker-5] Task news.tasks.fetch_news[c61a3e55-dd3c-4d49-8d6d-ca9b1757db25] succeeded in 0.39487219898728654s: None
[2018-12-21 13:00:00,606: INFO/ForkPoolWorker-3] Task news.tasks.fetch_news[583e96dc-f508-49fa-a24a-331e0c07a86b] succeeded in 0.5523456179944333s: None

以上就是celery4運行定時任務的內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 延川县| 屯昌县| 广宁县| 滦平县| 冀州市| 容城县| 唐山市| 开平市| 长丰县| 杨浦区| 噶尔县| 夏津县| 江孜县| 秦皇岛市| 雅安市| 温泉县| 鹰潭市| 南漳县| 黔江区| 威远县| 桂林市| 潮安县| 漯河市| 宁阳县| 岳西县| 依兰县| 邯郸县| 安岳县| 邹城市| 本溪市| 博罗县| 江油市| 方正县| 阿拉善左旗| 翼城县| 凤阳县| 咸阳市| 楚雄市| 柘城县| 洪泽县| 阿合奇县|