国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

利用Django和Celery管理定時任務(wù)

這篇具有很好參考價值的文章主要介紹了利用Django和Celery管理定時任務(wù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


同步發(fā)表于個人站點: http://panzhixiang.cn/article/2023/3/16/68.html

一、背景介紹

我們以前一直使用k8s的cronjob來管理定時任務(wù)的。把定時任務(wù)相關(guān)的代碼單獨封裝成一個pod,然后以cronjob的方法來觸發(fā)。

雖然這個方法操作很簡單,沒有什么第三方資源的依賴(比如Redis),但是也有一個明顯的缺點。

定時任務(wù)的代碼脫離了Django代碼,也就不能使用Django的很多功能了,只能通過DRF封裝的API來跟Django的Server通信。
有的時候為了一個定時任務(wù),要封裝很多API,還要考慮鑒權(quán)等問題,也挺麻煩的,所以就在新項目中打算換一個方法來做定時任務(wù)的管理。

同時使用Python和Django的工程師估計基本都知道Celery,它是一個很好的異步任務(wù)框架。我上一次使用它還是2020年,發(fā)現(xiàn)這幾年Celery的使用方法發(fā)生了一些變化,在網(wǎng)上找了一圈也沒有找到很好的中文資料,所以自己寫一篇相關(guān)的博客,希望能給以后需要查詢相關(guān)信息的人提供一點幫助。

二、Celery配置

在配置Celery之前需要先安裝,pip install celery, 接下來就開始配置了。

在正式開始介紹配置之前,我們需要一些假設(shè),以便下面的文字可以表述的更清楚。

我們以django-admin startproject proj創(chuàng)建一個Django項目,Django版本應(yīng)當(dāng)>=3.0, 創(chuàng)建成功之后我們會得到如下的一個目錄結(jié)構(gòu):

proj
├── manage.py
└── proj
    ├── asgi.py
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

熟悉Django的人應(yīng)該對上面這個目錄樹非常熟悉,下面的內(nèi)容都是基于這個目錄樹寫的,所以需要記住這個目錄樹。

1. 定義Celery實例

為了定義Celery實例,需要在上面的目錄樹中創(chuàng)建一個文件: proj/proj/celery.py。
這個文件名是celery.py,跟settings.py在同一層目錄。

內(nèi)容如下,我把一些很重要的信息以注釋的形式寫在代碼里了,注意查看。

import os
from celery import Celery


# 這個配置可以避免在其他的tasks.py中初始化django配置,雖然不是必須的,但是強烈建議要有這個配置
os.environ.setdefault(
    'DJANGO_SETTINGS_MODULE', 'proj.settings'
)

# 這個就是從環(huán)境變量中獲取redis的地址,我這里使用redis作為broker
REDIS_HOST = os.getenv('REDIS_HOST', 'localhost:6379')
app = Celery(
    'proj',  # 第一個參數(shù)是為celery的實例起了一個名字,這里叫做proj
    backend='redis://' + REDIS_HOST + '/1',
    broker='redis://' + REDIS_HOST + '/0',
)

# 可以用這個方法批量配置celery,
# 這幾個配置在一幫的場景中就足夠使用了
# 另外,其實還有幾種其他方法來配置celery,但是我覺得這個方法對于不是非常大的項目來說就足夠了。
app.conf.update(
    task_serializer='json',
    accept_content=['json'],  # Ignore other content
    result_serializer='json',
    enable_utc=True,
)

# 這一行會從django的settings文件中獲取一些celery的配置
# namespace等于CELERY的意思是settings中以 “CELERY_” 開頭的配置都會被識別為celery的配置
app.config_from_object('django.conf:settings', namespace='CELERY')

# 會自動發(fā)現(xiàn)所有Django app中的任務(wù)
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

除了上面這個配置,還有兩個地方需要配。
首先是需要在proj/proj/__init__.py中添加以下內(nèi)容:

from .celery import app as celery_app


__all__ = ('celery_app',)

它的作用是在啟動Django的時候自動加載celery。

還有一個就是需要在django的settings中添加celery的配置,也就是上面代碼中app.config_from_object('django.conf:settings', namespace='CELERY') 提到的部分。

CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60  # 單個任務(wù)的最大運行時間,單位是秒

2. 記錄任務(wù)的結(jié)果

用celery做任務(wù)調(diào)度的時候可以最好能把每一次任務(wù)的結(jié)果記錄下來,以便以后查閱,尤其是當(dāng)任務(wù)沒有按照預(yù)期運行的時候,這一點更加重要。

官網(wǎng)推薦使用django-celery-results做記錄任務(wù)結(jié)果。

  1. 安裝
    pip install django-celery-results
  2. 注冊
    django-celery-results是一個單獨的django的app,所以需要在settings.py注冊一下
    INSTALLED_APPS = (
        ...,
        'django_celery_results',
    )
    
    注冊之后還需要遷移數(shù)據(jù)庫,
    python manage.py migrate django_celery_results
  3. 配置
    django-celery-results只是一個幫助自動存儲任務(wù)結(jié)果的包,最終數(shù)據(jù)還需要一個地方落地,有很多地方都可以用來存儲任務(wù)結(jié)果,比如數(shù)據(jù)庫、本地文件系統(tǒng),redis等等,我這里使用數(shù)據(jù)庫,也比較推薦使用數(shù)據(jù)庫。
    在django的setting.py中添加一下配置:
    CELERY_RESULT_BACKEND = 'django-db'  # 使用數(shù)據(jù)庫做后端
    CELERY_CACHE_BACKEND = 'django-cache'  # 老實說,不知道這個緩存配置到底有什么作用,但是官網(wǎng)推薦使用這個配置,我也就留著了
    CELERY_CACHE_BACKEND = 'default'
    
  4. 啟動
    注意這個命令要在第一層proj目錄下運行,不然會報錯,提示找不到配置文件之類的錯誤
    celery -A backend worker --loglevel=INFO
    

三、定時任務(wù)配置

前面介紹了怎么樣配置celery,現(xiàn)在celery有了,要怎么來管理定時任務(wù)呢?這個時候就要用到django-celery-beat了,它的使用比較簡單。

1. 配置django-celery-beat

  1. 安裝
    pip install django-celery-beat
  2. 注冊
    在django的settings.py中進(jìn)行注冊
    INSTALLED_APPS = (
        ...,
        'django_celery_beat',
    )
    
    同樣,注冊之后要遷移數(shù)據(jù)庫,
    python manage.py migrate django-celery-beat
  3. 啟動
    注意這個命令要在第一層proj目錄下運行,不然會報錯,提示找不到配置文件之類的錯誤
    celery -A proj beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
    

想要單獨說明的是,很多人在使用django_celery_beat做定時任務(wù)管理的時候,喜歡把定時任務(wù)以cronjob的形式封裝在代碼中,但是我比較喜歡通過Django Admin頁面在數(shù)據(jù)庫中進(jìn)行配置。

因為封裝在代碼中,以后如果想要修改定時任務(wù),就需要重新寫代碼然后部署到環(huán)境中,不太友好,而且對于非技術(shù)人員來說,想要自己配置定時任務(wù)的可能性幾乎為零。

2. 通過Django Admin設(shè)置具體的定時任務(wù)

這一部分內(nèi)容比較簡單,把Django啟動,登錄到Admin頁面之后通過頁面點擊創(chuàng)建即可,不難,但是想寫出來要接很多圖,就不是很想寫了。

四、參考

  1. First Steps with Django
  2. Task result backend settings

歡迎關(guān)注我的公眾號
文章來源地址http://www.zghlxwxcb.cn/news/detail-726726.html

到了這里,關(guān)于利用Django和Celery管理定時任務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • docker容器內(nèi)的django啟動celery任務(wù)隊列

    celery任務(wù)隊列一般要使用redis,但是容器內(nèi)的django要訪問本機的redis是十分麻煩的 在容器內(nèi)安裝redis,或者單獨啟動一個redis的容器,我是單獨啟動一個redis容器 安裝redis鏡像 docker pull redis 啟動redis容器 docker run -d --name redis_container redis 查看redis的IP `docker inspect -f “{{range .Netwo

    2024年02月14日
    瀏覽(21)
  • Django框架-使用celery(一):django使用celery的通用配置,不受版本影響

    Django框架-使用celery(一):django使用celery的通用配置,不受版本影響

    目錄 一、依賴包情況 二、項目目錄結(jié)構(gòu) ?? 2.1、怎么將django的應(yīng)用創(chuàng)建到apps包 三、celery的配置 2.1、celery_task/celery.py 2.2、celery_task/async_task.py 2.3、celery_task/scheduler_task.py 2.4、utils/check_task.py 四、apps/user中配置相關(guān)處理視圖 4.1、基本配置 4.2、user的models 4.3、user的視圖函數(shù) 五、

    2024年02月13日
    瀏覽(19)
  • celery筆記四之在Django中使用celery

    celery筆記四之在Django中使用celery

    本文首發(fā)于公眾號:Hunter后端 原文鏈接:celery筆記四之在Django中使用celery 這一篇筆記介紹一下如何在 Django 系統(tǒng)中使用 celery。 如果是想純粹使用 celery,這一篇筆記可以略過。 本篇筆記目錄如下: 文件配置 task 定義 運行 worker 我們這里使用前面的創(chuàng)建的 hunter Django 系統(tǒng)。

    2024年02月09日
    瀏覽(18)
  • Django使用Celery異步

    Django使用Celery異步

    安裝包 1.在項目文件的根目錄下創(chuàng)建目錄結(jié)果 2. 在main.py文件中 ?3.config.py文件 4.在項目后端文件下執(zhí)行啟動命令,即可,此時說明clery已經(jīng)安裝成功! 5.在task.py文件中將發(fā)送短信的任務(wù)注冊到task中必須使用裝飾器并在裝飾器中設(shè)置別名便于區(qū)分 6.在視圖函數(shù)中調(diào)用異步任務(wù)

    2024年02月22日
    瀏覽(30)
  • django celery 記錄

    django celery 記錄

    django celery 記錄 dvadmin-celery Django+Django-Celery+Celery的整合實戰(zhàn) https://cloud.tencent.com/developer/article/1445252 https://blog.csdn.net/wowocpp/article/details/131475484 https://docs.celeryq.dev/en/latest/django/first-steps-with-django.html https://docs.celeryq.dev/en/latest/django/index.html http://docs.celeryproject.org/en/latest/ https://

    2024年02月12日
    瀏覽(21)
  • Django+Celery學(xué)習(xí)筆記

    Django+Celery學(xué)習(xí)筆記 DJANGO中使用CELERY實現(xiàn)定時任務(wù)(用DJCELERY) https://www.cnblogs.com/wumingxiaoyao/p/8521567.html Django中celery機制的使用總結(jié) https://blog.csdn.net/Enjolras_fuu/article/details/108513357 代碼 https://github.com/furuiyang0715/celery_learn 參考 https://www.celerycn.io/yong-hu-zhi-nan/canvas-she-ji-gong-zuo-liu-che

    2024年02月12日
    瀏覽(22)
  • Django+celery開啟時報錯

    django.db.utils.DatabaseError: DatabaseWrapper objects created in a thread can only be used in that same thread. The object with alias \\\'default\\\' was created in thread id 19767205568 00 and this is thread id 1976775359680. 問題: 執(zhí)行celery worker -A s1 -l info -P eventlet能正常,放立即執(zhí)行的任務(wù)(delay)沒有問題,不過放apply_async的任務(wù)

    2024年02月11日
    瀏覽(14)
  • redis(其它操作、管道)、django中使用redis(通用方案、 第三方模塊)、django緩存、celery介紹(celery的快速使用)

    redis(其它操作、管道)、django中使用redis(通用方案、 第三方模塊)、django緩存、celery介紹(celery的快速使用)

    1 redis其它操作 2 redis管道 3 django中使用redis 3.1 通用方案 3.2 第三方模塊 4 django緩存 5 celery介紹 5.1 celery的快速使用

    2024年02月07日
    瀏覽(26)
  • django celery period 周期 例子

    django celery period 周期 例子 Django 借助 Celery 實現(xiàn)計劃任務(wù)排期及調(diào)度系統(tǒng)(django-celery-beat) good https://www.jianshu.com/p/f22346379dbe https://django-celery-results.readthedocs.io/en/latest/ https://django-celery-beat.readthedocs.io/en/latest/ 五、運行測試 為了使系統(tǒng)正常運行,需要同時開啟三個服務(wù): web 服

    2024年02月12日
    瀏覽(16)
  • Django高級擴(kuò)展之celery使用

    Django高級擴(kuò)展之celery使用

    Celery是一個簡單、靈活、可靠的分布式系統(tǒng),用于處理大量消息,同時為操作提供維護(hù)此類系統(tǒng)所需的工具。是一個專注于實時處理的任務(wù)隊列,同時還支持任務(wù)調(diào)度。 目錄 應(yīng)用場景 問題 解決 celery架構(gòu)圖 安裝 配置celery Settings.py配置 創(chuàng)建celery 修改__init__ 開啟celery 異步執(zhí)行

    2024年02月11日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包