日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用celery4和django2怎么實現(xiàn)定時任務-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關使用celery4和django2怎么實現(xiàn)定時任務,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)是一家從事企業(yè)網(wǎng)站建設、成都網(wǎng)站建設、成都做網(wǎng)站、行業(yè)門戶網(wǎng)站建設、網(wǎng)頁設計制作的專業(yè)網(wǎng)站設計公司,擁有經(jīng)驗豐富的網(wǎng)站建設工程師和網(wǎng)頁設計人員,具備各種規(guī)模與類型網(wǎng)站建設的實力,在網(wǎng)站建設領域樹立了自己獨特的設計風格。自公司成立以來曾獨立設計制作的站點近千家。

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執(zhí)行任務就必須實例化一個celery app,并把settings.py里的配置傳入app:

import os
from 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會根據(jù)前面設置的環(huán)境變量自動查找并導入
# - namespace表示在settings.py中celery配置項的名字的統(tǒng)一前綴,這里是'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目錄中,前面我們配置了自動發(fā)現(xiàn),所以celery會自動找到這些tasks,我們的tasks將寫在這一模塊中,代碼涉及了一些orm的使用,為了契合主題我做了些精簡:

from linux_news.celery import celery_app as app
from .models import *
import time
import feedparser
import pytz
import 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里是一些耗時操作,比如網(wǎng)絡IO或者數(shù)據(jù)庫讀寫,因為我們不關心任務的返回值,所以使用 @app.task(ignore_result=True) 將其屏蔽了。

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

# redis
REDIS_PORT = 6379
REDIS_DB = 0
# 從環(huán)境變量中取得redis服務器地址
REDIS_HOST = os.environ.get('REDIS_ADDR', 'redis')

# celery settings
# 這兩項必須設置,否則不能正常啟動celery beat
CELERY_ENABLE_UTC = True
CELERY_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 crontab
CELERY_BEAT_SCHEDULE={
    'fetch_news_every-1-hour': {
      'task': 'news.tasks.fetch_all_news',
      'schedule': crontab(minute=0, hour='*/1'),
    }
}

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

  • task:任務函數(shù)所在的模塊,模塊路徑得寫全,否則找不到將無法運行該任務

  • schedule:定時策略,一般使用 celery.schedules.crontab ,上面例子為每小時的0分執(zhí)行一次任務,具體寫法與linux的crontab類似可以參考文檔說明

  • args:是個元組,給出任務需要的參數(shù),如果不需要參數(shù)也可以不寫進配置,就像例子中的一樣

  • 其余配置項較少用,可以參考文檔

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

啟動celery beat

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

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

start-celery.sh:

export REDIS_ADDR=127.0.0.1

celery -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

看完上述內(nèi)容,你們對使用celery4和django2怎么實現(xiàn)定時任務有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)站名稱:使用celery4和django2怎么實現(xiàn)定時任務-創(chuàng)新互聯(lián)
本文URL:http://www.dlmjj.cn/article/djedhe.html