国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - celery4+django2定時任務的實現代碼

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

2021-05-06 00:21apocelipes Python

這篇文章主要介紹了celery4+django2定時任務的實現代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

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

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

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

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

Celery定時任務配置

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.
├── 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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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會根據前面設置的環境變量自動查找并導入
# - 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中導入它:

?
1
from .celery import app as celery_app

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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里是一些耗時操作,比如網絡IO或者數據庫讀寫,因為我們不關心任務的返回值,所以使用 @app.task(ignore_result=True) 將其屏蔽了。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# redis
REDIS_PORT = 6379
REDIS_DB = 0
# 從環境變量中取得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'

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

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

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

啟動celery beat

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

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

start-celery.sh:

?
1
2
3
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

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

原文鏈接:http://www.cnblogs.com/apocelipes/p/10156224.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 艹逼逼视频 | 6080亚洲精品一区二区 | 精品免费国产一区二区三区四区 | 羞羞的视频在线 | 蜜桃精品在线观看 | 人人爱夜夜爽日日视频 | 亚洲色图88 | 久久专区| 欧美激情一区二区 | 成人在线精品视频 | 中文字幕日韩在线 | 免费看一级黄色片 | 精品欧美一区二区三区久久久 | 日韩av在线不卡 | 亚洲免费国产视频 | 久草福利资源 | 日韩欧美国产一区二区 | 91精品国产一区二区三区四区在线 | 午夜视频在线观看免费视频 | 日韩免费一区二区 | 久久国产精品一区二区 | 综合久久久久 | 国产精品日产欧美久久久久 | 看a网站| 欧美香蕉 | 日韩第一区 | 精品久久一区二区 | 久久精品国产亚洲一区二区三区 | 国产精品1区 | 欧美激情国产日韩精品一区18 | 午夜成人免费电影 | 国产日韩在线视频 | 久久久综合色 | 精品无码久久久久久久动漫 | 日本一二三视频 | 国产精品成人一区二区 | 久久久久国产精品免费免费搜索 | 免费成人小视频 | 草久网| 午夜男人| 精精国产xxxx视频在线播放7 |