在本教程中,我們將討論最流行的、Python 開發人員必須學習的技術。Python 開發人員協會中的每個人都已經了解了 Celery,或者可能已經實現了至少一次。
在快速互聯網時代,用戶希望瞬間加載頁面,幾秒鐘就能得到結果。小任務可以在一秒或幾微秒內執行,但重任務可能需要幾秒甚至一分鐘。
那麼問題來了,當我們複雜的任務還在加載的時候,我們如何提供快速的用戶體驗呢?
下面是異步編程的作用。Celery 用於任務的並行執行。
當中央處理器處於理想狀態時,Celery 提供了在後台運行程序/作業的工具。在深入探討這個話題之前,讓我們先了解一下 Celery 的核心概念,以及我們為什麼要使用它。
在本教程中,我們將討論 Celery 的以下概念。
- Celery 是什麼?
- 它是如何工作的?
- 什麼是任務隊列?
- 什麼是消息代理?
- 這為什麼有用?
- 它是如何工作的?
- Celery 的特點
- Celery 入門
Celery 是一個開源的 Python 庫,用於異步運行任務。它是一個任務隊列,保存任務,並以適當的方式將其分配給工人。它主要關注實時操作,但也支持調度(運行定期間隔任務)。它驚人地增強了最終用戶的活動。Celery 介紹了rabbtmq**Redis 等各種消息經紀人。**
Celery 結合了各種網絡框架,包括 Flask、Pylons、web2py、Tryton 和 Tornado。
假設我們需要每分鐘(小時)訪問一次 API,或者我們想在一天結束時發送多封電子郵件。Celery 可以很容易地安排這類周期性任務。
讓我們看另一個場景:用戶發送請求,頁面加載時間過長。同時,Celery 通過在同一台服務器或不同的服務器上運行部分延期任務的功能來減少頁面加載時間。
Celery 的工人可以通過回調更新用戶界面,處理文件,發送電子郵件,修改數據庫等等。
Celery 的主要優點是我們的應用可以繼續響應客戶端請求。因此最終用戶不必不必等待。
在傳統的 HTTP 請求-響應周期中,當我們通過客戶端向服務器發送請求時,服務器向客戶端發送響應。它適用於小任務,但當我們試圖加載大任務時,它可能會變得很慢。因此,我們需要實現一個可以減少加載時間的功能。
讓我們了解 Celery 的工作場景。
Celery 通過信息相互作用;通常經紀人是客戶和工人之間的中間人。Celery 的內向型工作被確認為生產者和消費者模式。Celery 有三大高級元素。
生產者- 生產者是管理網絡請求的【網絡節點】。當應用正在處理時,任務被分配給 Celery 意味着被強制進入任務隊列。
消費者- 消費者是【工人節點】監控隊列頭,工人承擔任務並執行。工人也可以執行各種任務;因此,他們也可以扮演生產者的角色。
Queue – 它基本上是一個消息代理,充當生產者和消費者之間的橋樑。它本質上是在 web 應用和 Celery 工人之間傳遞消息。Celery 得到了 RabbitMQ 和 Redis 的廣泛支持,也幫助了動物園管理員,亞馬遜 SQS,但能力有限。
Celery 是一種方便的結構,通過延遲的任務減少生產負荷,因為它準備異步和計劃的工作。以下是 Celery 的一些重要特徵。
- 開源庫- Python Celery 是開源免費軟件。這個特性吸引了組織或開發人員使用 Celery 來解決他們的任務,而無需支付一分錢。
- 直接安裝- 這是一個輕量級的簡單庫,可以輕鬆安裝。我們可以使用“pip install-U Celery”命令從終端安裝。
- 調度- 我們可以使用日期時間模塊以及Celery 節拍來指定運行任務的特定時間。Celery 拍可以定期觸發任務。我們可以基於簡單的時間間隔對重複事件使用周期性任務。
- 經紀人支持- Celery 支持多個消息經紀人,通俗的說就是rabbtmq,它也支持亞馬遜 SQS,但是在某些功能上有所欠缺(監控和遠程控制)。
- 與網絡框架的集成- Celery 還與各種 Python 網絡框架相結合,如金字塔、掛架、Django、Tornado、Trylons 和 Flask。
- Fast – Celery 可以在一分鐘內處理數百萬個任務。
- 作品流- 它可以使用一組被稱為“畫布”的高級原語來組合簡單和複雜的作品流。
在本教程中,我們將使用 Django 實現 Celery,在這裡我們將創建一個簡單的任務隊列。讓我們從下面的步驟開始。
首先,我們將在Celery _django 文件夾中創建一個名為learn _ Celery的 Django 項目。但首先我們將創建虛擬環境。所有依賴項都將存儲在虛擬環境中。
創建虛擬環境後,我們將使用以下命令激活。
使用以下命令安裝 Django。
安裝Django 後,創建項目。我們正在使用下面的命令創建名為學習 Celery的項目。
如果您不熟悉如何在 Django、中創建項目或應用,可以訪問我們的 Django 教程。現在,我們準備在虛擬環境中安裝 Celery。
我們可以使用下面的命令安裝 Celery。
Celery 安裝完成後,我們將在 Django 項目中配置 Celery。
打開項目的 settings.py 文件並添加以下配置。我們使用 redis 作為消息代理。
代理是使應用、系統和服務能夠通信和共享信息的獨立服務。讓我們簡化這個術語,我們通過消息隊列將任務分配給工作人員。消息隊列是一種先進先出的數據結構,這意味着首先存儲的消息將首先被執行。所有任務將按照我們添加的順序執行。
在本教程中,我們將使用 Redis 消息代理。
Windows 中的 Redis 安裝
在 Mac/Ubuntu 中安裝 Redis 非常簡單,但對 Window 來說有點棘手。所以這裡我們描述如何在 Windows 中安裝 redis。
- 訪問 Github 鏈接https://github.com/tporadowski/redis/releases,點擊 Redis-x64-5.0.14.msi 。它將下載。msi 文件。
- 點擊下載的設置。它會自動將 redis 安裝在你的 C: drive 系統中。安裝完成後,打開 redis-cli 並鍵入 PING。
運行 Celery 程序也需要 Redis 依賴。我們可以使用下面的命令安裝 redis 依賴項。
安裝完成後,使用以下命令啟動服務器。
我們可以通過在終端中鍵入以下命令來測試 Redis 是否正常工作。
如果用 PONG 回復,工作正常。
現在打開 Django 項目中的 Celery. py 文件,並添加下面的代碼。
Celery 皮
import os
from celery import Celery
from celery.schedules import crontab
# Set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'learn_django.settings')
#pass the project name in Celery(project_name)
app = Celery('learn_django')
# 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')
#Celery Beat Settings
app.conf.beat_schedule = {
'send-mail-every-day-at-8' : {
'task': 'emailExample.tasks.send_mail_func',
'schedule': crontab(hour = 15, minute = 42),
}
}
# 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}')
Celery 任務可以在 Django 應用/項目的 tasks.py 中創建。我們使用下面的命令在工作目錄中創建一個應用。
C:\Users\User\Desktop\celery_django>python manage.py startapp celeryApp .
一旦創建了應用,創建一個任務。複製文件並創建一個任務。這些任務是用 Celery 調用的常規 Python 函數。例如,我們創建了一個函數來打印 1 到 10 的整數。
rom celery import shared_task
@shared_task(bind=True)
def test_func(self):
for i in range(10):
print(i)
return "Completed"
現在在 view.py 文件中創建一個視圖。
view.py
from django.http import HttpResponse
# importing task from tasks.py file
from .tasks import test_func
# Create your views here.
def test(request):
# call the test_function using delay, calling task
test_func.delay()
return HttpResponse("Done")
現在我們將把這個視圖映射到 urls.py 文件中的 URL。
celery app/URL . py
from django.urls import path
urlpatterns = [
path('', test, name='test'),
pip install django-celery-result
現在,我們準備執行第一個異步任務。現在運行 python manage.py runserver ,點擊本地主機鏈接 http://127.0.0.1:8000/。
現在打開新終端,導航到項目目錄,激活虛擬環境。要啟動 Celery 工人,請運行以下命令。
PS D:\celeryPython> celery -A CeleryDjango.celery worker --pool=solo -l info
正如我們所看到的,我們的 Celery 已經開始並準備執行後台工作。默認情況下,Redis 消息代理運行在 6379 端口上。
[2022-01-07 23:10:27,920: INFO/MainProcess] Connected to redis://127.0.0.1:6379//
[2022-01-07 23:10:27,936: INFO/MainProcess] mingle: searching for neighbors
[2022-01-07 23:10:29,007: INFO/MainProcess] mingle: all alone
[2022-01-07 23:10:29,029: WARNING/MainProcess] C:\Users\DEVANSH SHARMA\.virtualenvs\celeryPython-O5XHNBO2\lib\site-packages\celery\fixups\django.py:203: UserWarning: Using settings.DEBUG leads to a memory
leak, never use this setting in production environments!
warnings.warn('''Using settings.DEBUG leads to a memory
每次當我們訪問 http://127.0.0.1:8000/向 Django 服務器發出請求時,我們應該會看到響應,Celery 會在後台異步執行我們在 task.py 文件中定義的任務。可以在 Celery 終端監控。
Celery 是一個強大的作業隊列,可以在後台運行任務。它最常用於發送頻繁的電子郵件。但是,它可以多種方式使用。我們可以排隊;在手頭長期運行的任務上使用數據塊,並定義執行任務的時間。
在本教程中,我們使用 Django 以 Celery 為例。我們已經定義了 Celery 的基本概念及其工作原理。我們還指定了如何與 Django 一起實現 Celery。您可以參考本教程,並使用 Celery 來運行您的異步任務。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126622.html