[ Celery ] Asynchronous Tasks in Python - Celery Backend Tutorial (2/4)

本文為影片筆記,文中內容與影片不一定完全相同。
Celery 的記錄器有非常多的選擇,有興趣可以參考這裡,影片中使用的是 Database。
將 Celery 官方提供的 Database 連結加入上一篇文章的代碼中:
# tasks.py

from celery import Celery

app = Celery('tasks', 
 broker='redis://localhost:6379/0',
 backend='db+sqlite:///results.sqlite')

@app.task
def reverse(string):
 return string[::-1]
影片中使用的是 MySQL, 但我選用 SQLite 比較容易上手。
如果想用其他 Database 請參考這裡
啟動 Celery:
$ celery -A tasks worker --loglevel=info
執行 Flask App:
>>> from tasks import *
>>> reverse.delay('Anthony')
你將會得到與前一張相同的結果。唯一不同的是,資料夾中會出現 “results.sqlite”。
透過 DB Browser for SQLite 開啟。DB Browser for SQLite 可以透過它的 GitHub 下載。

選擇 Browse Data,在資料表中可以看到影片中提到的 celery_taskmeta 和 celery_tasksetmeta。
下方欄位中就可以看到曾經執行的任務了。
修改 tasks.py:
# tasks.py

from celery import Celery
import time

app = Celery('tasks', 
 broker='redis://localhost:6379/0',
 backend='db+sqlite:///results.sqlite')

@app.task
def reverse(string):
 time.sleep(10)  # 延遲10秒
 return string[::-1]
測試緩存器 :
終端機將會出現以下結果。
>>> from tasks import *
>>> result = reverse.delay('Anthony')
>>> result.status  # 10秒內輸入。因延遲10秒,所以未收到資料,因此顯示‘PENDING'
'PENDING'
>>> result.status  # 10秒後,記錄器已經收到資料,因此顯示‘SUCCESS'
'SUCCESS'
>>> result = reverse.delay('Pretty Printed')
>>> result.ready()  # 未收到資料,因此顯示 False
False
>>> result.ready()  # 已收到資料,因此顯示 Ture
True
>>> result.get()  # 顯示收到的資料
'detnirP ytterP'
>>>  

輸入過程中可以同時觀察執行 Celery 的終端機,可以發現記錄器確實會延遲收到資訊,收到資料後變數狀態也會改變。
測試緩存的過程可能用文字敘述較難理解,可以直接觀看影片比較容易明白,該操作部分是從 4:47 開始。
接著可以重新開啟 SQLite 檢視剛剛輸入的資料。

慚愧的說,使用 SQLite 是因為其他的資料庫都不太熟。應該會再找時間學學其他的資料庫。

Asynchronous Tasks in Python - Getting Started With Celery (1/4)
Asynchronous Tasks in Python - Celery Backend Tutorial (2/4)
Asynchronous Task in Flask Using Celery (3/4)
Flask, Celery & SQLAlchemy Example (4/4)

留言