python3.8+django2+celery5.2.7環(huán)境準(zhǔn)備(python測(cè)試開發(fā)django)
前言
以前版本的 Celery 需要一個(gè)單獨(dú)的庫(django-celery)來與 Django 一起工作,但從 3.1 開始不再是這種情況。
現(xiàn)在支持開箱即用的 Django,因此本文檔僅包含集成 Celery 和 Django 的基本方法.
celery5.x 不支持windows平臺(tái)了。Celery 5.0.x 支持 Django 1.11 LTS 或更新版本。
版本要求
Celery 5.2 版運(yùn)行于
- Python?3.7、3.8、3.9、3.10?
- PyPy3.7、3.8 ?7.3.7?
Celery 4.x 是支持 Python 2.7 的最后一個(gè)版本,
Celery 5.x 需要 Python 3.6 或更高版本。
Celery 5.1.x 還需要 Python 3.6 或更高版本。
Celery 5.2.x 需要 Python 3.7 或更新版本。
如果您運(yùn)行的是舊版本的 Python,則需要運(yùn)行舊版本的 Celery:
Python 2.7 或 Python 3.5:Celery 系列 4.4 或更早版本。
Python 2.6:Celery 系列 3.1 或更早版本。
Python 2.5:Celery 系列 3.0 或更早版本。
Python 2.4 是 Celery 系列 2.2 或更早版本。
Celery 是一個(gè)資金很少的項(xiàng)目,所以不支持 Microsoft Windows。請(qǐng)不要打開與該平臺(tái)相關(guān)的任何問題。
環(huán)境準(zhǔn)備
運(yùn)行系統(tǒng):linux(centos/debian/ubuntu),不支持windows
Python版本:3.8.5
Django : 2.2.2
celery: 5.2.7
使用pip安裝celery5.2.7版本
pip install celery==5.2.7
Django中使用Celery
要在 Django 項(xiàng)目中使用 Celery,您必須首先定義 Celery 庫的實(shí)例(稱為“應(yīng)用程序”)
如果你有一個(gè)現(xiàn)代的 Django 項(xiàng)目布局,比如:
- proj/ - manage.py - proj/ - __init__.py - settings.py - urls.py
那么推薦的方法是創(chuàng)建一個(gè)新的proj/proj/celery.py模塊來定義 Celery 實(shí)例:
proj/proj/celery.py
文件內(nèi)容
import os from celery import Celery # Set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') app = Celery('proj') # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. # - namespace='CELERY' means all celery-related configuration keys # should have a `CELERY_` prefix. app.config_from_object('django.conf:settings', namespace='CELERY') # Load task modules from all registered Django apps. app.autodiscover_tasks() @app.task(bind=True) def debug_task(self): print(f'Request: {self.request!r}')
然后你需要在你的proj/proj/init.py 模塊中導(dǎo)入這個(gè)應(yīng)用程序。這可以確保在 Django 啟動(dòng)時(shí)加載應(yīng)用程序,以便@shared_task裝飾器(稍后提到)將使用它:
proj/proj/__init__.py
內(nèi)容:
# This will make sure the app is always imported when # Django starts so that shared_task will use this app. from .celery import app as celery_app __all__ = ('celery_app',)
請(qǐng)注意,此示例項(xiàng)目布局適用于較大的項(xiàng)目,對(duì)于簡(jiǎn)單的項(xiàng)目,您可以使用單個(gè)包含的模塊來定義應(yīng)用程序和任務(wù)
讓我們分解第一個(gè)模塊中發(fā)生的事情,首先,我們?cè)O(shè)置默認(rèn)值DJANGO_SETTINGS_MODULEcelery命令行程序的環(huán)境變量:
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
您不需要此行,但它使您不必總是將設(shè)置模塊傳遞給celery程序。它必須始終在創(chuàng)建應(yīng)用程序?qū)嵗俺霈F(xiàn),就像我們接下來要做的那樣:
app = Celery('proj')
這是我們的庫實(shí)例,您可以有很多實(shí)例,但在使用 Django 時(shí)可能沒有理由這樣做。
我們還將 Django 設(shè)置模塊添加為 Celery 的配置源。這意味著您不必使用多個(gè)配置文件,而是直接從 Django 設(shè)置中配置 Celery;但如果需要,您也可以將它們分開。
app.config_from_object('django.conf:settings', namespace='CELERY')
大寫命名空間意味著所有 Celery 配置選項(xiàng) 必須以大寫而不是小寫指定,并且以 開頭 CELERY_,例如task_always_eager設(shè)置變?yōu)镃ELERY_TASK_ALWAYS_EAGER,broker_url 設(shè)置變?yōu)镃ELERY_BROKER_URL。這也適用于工作人員設(shè)置,例如,worker_concurrency 設(shè)置變?yōu)镃ELERY_WORKER_CONCURRENCY.
例如,一個(gè) Django 項(xiàng)目的配置文件可能包括:
... # Celery Configuration Options CELERY_TIMEZONE = "Australia/Tasmania" CELERY_TASK_TRACK_STARTED = True CELERY_TASK_TIME_LIMIT = 30 * 60
您可以直接傳遞設(shè)置對(duì)象,但使用字符串更好,因?yàn)檫@樣工作人員不必序列化對(duì)象。CELERY_命名空間也是可選的,但建議使用(以防止與其他 Django 設(shè)置重疊)。
接下來,可重用應(yīng)用程序的一個(gè)常見做法是在單獨(dú)的tasks.py模塊中定義所有任務(wù),Celery 確實(shí)有一種方法可以自動(dòng)發(fā)現(xiàn)這些模塊:
app.autodiscover_tasks()
使用上面的代碼,Celery 將自動(dòng)從您安裝的所有應(yīng)用程序中發(fā)現(xiàn)任務(wù),遵循tasks.py約定:
- app1/ - tasks.py - models.py - app2/ - tasks.py - models.py
這樣您就不必手動(dòng)將各個(gè)模塊添加到CELERY_IMPORTS設(shè)置中。
最后,該debug_task示例是一個(gè)轉(zhuǎn)儲(chǔ)自己的請(qǐng)求信息的任務(wù)。這是使用bind=True Celery 3.1 中引入的新任務(wù)選項(xiàng)來輕松引用當(dāng)前任務(wù)實(shí)例。
使用 @shared_task
裝飾器
您編寫的任務(wù)可能會(huì)存在于可重用的應(yīng)用程序中,而可重用的應(yīng)用程序不能依賴于項(xiàng)目本身,因此您也不能直接導(dǎo)入您的應(yīng)用程序?qū)嵗?/p>
裝飾器允許您在@shared_task沒有任何具體應(yīng)用實(shí)例的情況下創(chuàng)建任務(wù):
demoapp/tasks.py:
# Create your tasks here from demoapp.models import Widget from celery import shared_task @shared_task def add(x, y): return x + y @shared_task def mul(x, y): return x * y @shared_task def xsum(numbers): return sum(numbers) @shared_task def count_widgets(): return Widget.objects.count() @shared_task def rename_widget(widget_id, name): w = Widget.objects.get(id=widget_id) w.name = name w.save()
您可以在以下位置找到 Django 示例項(xiàng)目的完整源代碼: https ://github.com/celery/celery/tree/master/examples/django/
django-celery-results 保存結(jié)果
django-celery-results- 使用 Django ORM/Cache 作為結(jié)果后端
django-celery-results擴(kuò)展使用Django ORM 或 Django Cache 框架提供結(jié)果后端。
要將其用于您的項(xiàng)目,您需要執(zhí)行以下步驟:
1.安裝django-celery-results庫:
pip install django-celery-results
2.添加django_celery_results到INSTALLED_APPS您的 Django 項(xiàng)目中settings.py:
INSTALLED_APPS = ( ..., 'django_celery_results', )
請(qǐng)注意,模塊名稱中沒有破折號(hào),只有下劃線。
3.通過執(zhí)行數(shù)據(jù)庫遷移來創(chuàng)建 Celery 數(shù)據(jù)庫表:
python manage.py migrate django_celery_results
4.配置 Celery 以使用django-celery-results后端。
假設(shè)您使用 Djangosettings.py來配置 Celery,添加以下設(shè)置
CELERY_RESULT_BACKEND = 'django-db'
對(duì)于緩存后端,您可以使用:
CELERY_CACHE_BACKEND = 'django-cache'
我們也可以使用 django 的 CACHES 設(shè)置中定義的緩存。
# celery setting. CELERY_CACHE_BACKEND = 'default' # django setting. CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', 'LOCATION': 'my_cache_table', } }
有關(guān)其他配置選項(xiàng),請(qǐng)查看 任務(wù)結(jié)果后端https://docs.celeryq.dev/en/stable/userguide/configuration.html#conf-result-backend設(shè)置參考。
django-celery-beat 定時(shí)任務(wù)
django-celery-beat- 具有管理界面的數(shù)據(jù)庫支持的定期任務(wù)。 詳細(xì)資料參考https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html#beat-custom-schedulers
啟動(dòng)工作進(jìn)程
在生產(chǎn)環(huán)境中,您將希望在后臺(tái)將工作程序作為守護(hù)程序運(yùn)行 - 請(qǐng)參閱守護(hù)程序-但對(duì)于測(cè)試和開發(fā),能夠使用 celery worker manage 命令啟動(dòng)工作程序?qū)嵗苡杏?,就像您一樣d 使用 Django 的 manage.py runserver:
celery -A proj worker -l INFO
有關(guān)可用命令行選項(xiàng)的完整列表,請(qǐng)使用幫助命令:
celery help
到此這篇關(guān)于python3.8+django2+celery5.2.7環(huán)境準(zhǔn)備的文章就介紹到這了,更多相關(guān)python3.8+django2+celery5.2.7環(huán)境內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)簡(jiǎn)易凱撒密碼的示例代碼
密碼的使用最早可以追溯到古羅馬時(shí)期,《高盧戰(zhàn)記》有描述愷撒曾經(jīng)使用密碼來傳遞信息,即所謂的“愷撒密碼”。本文將利用Python實(shí)現(xiàn)簡(jiǎn)易的凱撒密碼,感興趣的可以了解一下2022-09-09python中利用await關(guān)鍵字如何等待Future對(duì)象完成詳解
為了簡(jiǎn)化并更好地標(biāo)識(shí)異步IO,從Python 3.5開始引入了新的語法async和await,可以讓coroutine的代碼更簡(jiǎn)潔易讀。下面這篇文章主要給大家介紹了關(guān)于python中利用await關(guān)鍵字如何等待Future對(duì)象完成的相關(guān)資料,需要的朋友可以參考下。2017-09-09Python文件夾與文件的操作實(shí)現(xiàn)代碼
最近在寫的程序頻繁地與文件操作打交道,這塊比較弱,還好在百度上找到一篇不錯(cuò)的文章,這是原文傳送門,我對(duì)原文稍做了些改動(dòng)2014-07-07如何將Pycharm中調(diào)整字體大小的方式設(shè)置為"ctrl+鼠標(biāo)滾輪上下滑"
這篇文章主要介紹了如何將Pycharm中調(diào)整字體大小的方式設(shè)置為"ctrl+鼠標(biāo)滾輪上下滑",本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Python2.X/Python3.X中urllib庫區(qū)別講解
本篇文章通過對(duì)比給大家詳細(xì)講解了在Python2和Python3中urllib庫區(qū)別以及用法講解,有需要的朋友跟著學(xué)習(xí)下吧。2017-12-12Python實(shí)現(xiàn)快速排序算法及去重的快速排序的簡(jiǎn)單示例
quick sort快速排序是一種再基礎(chǔ)不過的排序算法,使用Python代碼寫起來相當(dāng)簡(jiǎn)潔,這里我們就來看一下Python實(shí)現(xiàn)快速排序算法及去重的快速排序的簡(jiǎn)單示例:2016-06-06JavaScript實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組
下面小編就為大家分享一篇JavaScript實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)化為二維數(shù)組,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04