首頁 > 後端開發 > Python教學 > 學習Python Celery,輕鬆完成非同步任務

學習Python Celery,輕鬆完成非同步任務

WBOY
發布: 2023-04-23 15:31:16
轉載
1766 人瀏覽過

雖然現代的網路應用程式比以往任何時候都更快速、更便捷,但仍有許多情況下,需要把繁重的任務轉移到系統的其他部分執行,而不是在主執行緒上進行工作。

這些情況中的範例如下:

  • 週期性任務 —— 規劃在特定時間間隔內執行的工作。例如,每日、每月的報告產生。
  • 第三方工具 —— 應用程式應該快速向使用者回傳回應,而不是等待其他任務先完成。例如,發送電子郵件、通知,將更新進度傳遞給內部工具。
  • 長時間運行的工作 —— 執行複雜或資源昂貴的工作,使用者需要等待工作完成。例如。 DAG工作流程、基於Map-Reduce的任務、長時間運行的Spark作業等。

那麼,如何處理這些情況呢?這時,Celery就派上用場了。

什麼是Celery?

Celery是一個開源的任務佇列實現,通常與基於Python的網路框架(如Flask和Django)相結合,在典型的請求-回應週期之外非同步執行任務。

因此,Celery本質上是一個基於分散式訊息傳遞的任務佇列。執行單元或任務在一個或多個worker上使用多處理、gevent或Eventlet同時執行。這些任務可以同步執行(即等到準備就緒)或非同步執行(即在背景)。

轻松完成异步任务,一文搞懂Python Celery

Celery是如何運作的?

Celery是一個分散式任務隊列,基於生產者-消費者模式。

任務佇列是用於跨執行緒和機器分配工作的機制,本質上是生產者(網路應用程式)和消費者(Celery工作者)之間的訊息中介。

Celery透過訊息進行交互,代理商(broker)在客戶(生產者)和工作者(消費者)之間充當中間人。為了啟動任務,客戶端將訊息推送到佇列中,然後代理將該訊息傳遞給工作者。

Celery系統可以由多個worker和broker組成,這為高可用性和橫向擴展提供了可能。

簡而言之,Celery客戶端是生產者,它透過訊息代理程式為佇列中新增新的任務。然後,Celery工作者同樣透過訊息代理從佇列中取得新的任務。一旦處理完畢,結果就會儲存在結果後端。

工作實例

下面的範例將使用RedisMQ作為訊息代理。

設定Redis

在linux/macOS系統上,透過下列指令在本機上執行Redis伺服器:

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ rm redis-stable.tar.gz
$ cd redis-stable
$ make
登入後複製

設定好Redis後,執行下列指令執行Redis伺服器:

$ redis-server
登入後複製

該伺服器在預設的6379連接埠運行。

設定應用程式

首先,在本地設定Python專案。

Celery可以透過標準工具如pip或easy_install來安裝。透過以下命令安裝Celery和Redis:

pip install celery redis==4.3.4
登入後複製

現在需要一個Celery實例來運行應用程序,Celery實現任何任務都是以實例開始,例如創建和管理任務等。

在專案中建立一個檔案tasks.py:

From celery import Celery

broker_url = 'redi://localhost:6379/0'

app = Celery('tasks',broker = broker_url)

@app.task
def add(x, y):
return x+y
登入後複製

這裡定義了一個簡單的任務add(),傳回兩個數字的總和。

運行Celery Worker

在終端機上,切換到專案位置並用以下命令運行Celery worker:

$ celery -A tasks worker - loglevel=info
登入後複製

關於Celery worker命令行的詳細信息,可以使用help:

$ celery worker - help
登入後複製

呼叫任務

在Celery中,使用delay()方法來呼叫任務。

開啟專案的另一個終端機視窗並執行以下命令:

$ python
登入後複製

這將開啟Python命令列。

>> from tasks import add
>> add.delay(1,2)
登入後複製

這將傳回一個AsyncResult實例,可以用來檢查任務狀態,獲得其傳回值,等待任務完成,也可以在失敗時獲得異常和回溯。

執行add.delay()指令後,任務會被推送到佇列中,然後被worker取得。這可以在Celery worker終端機上進行驗證,可以清楚地看到任務被接收,之後任務成功完成。

以上是學習Python Celery,輕鬆完成非同步任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板