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

本文為影片筆記,文中內容與影片不一定完全相同。
Celery 的記錄器有非常多的選擇,有興趣可以參考這裡,影片中使用的是 Database。
將 Celery 官方提供的 Database 連結加入上一篇文章的代碼中:
  1. # tasks.py
  2.  
  3. from celery import Celery
  4.  
  5. app = Celery('tasks',
  6. broker='redis://localhost:6379/0',
  7. backend='db+sqlite:///results.sqlite')
  8.  
  9. @app.task
  10. def reverse(string):
  11. 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:
  1. # tasks.py
  2.  
  3. from celery import Celery
  4. import time
  5.  
  6. app = Celery('tasks',
  7. broker='redis://localhost:6379/0',
  8. backend='db+sqlite:///results.sqlite')
  9.  
  10. @app.task
  11. def reverse(string):
  12. time.sleep(10) # 延遲10秒
  13. return string[::-1]
測試緩存器 :
終端機將會出現以下結果。
  1. >>> from tasks import *
  2. >>> result = reverse.delay('Anthony')
  3. >>> result.status # 10秒內輸入。因延遲10秒,所以未收到資料,因此顯示‘PENDING'
  4. 'PENDING'
  5. >>> result.status # 10秒後,記錄器已經收到資料,因此顯示‘SUCCESS'
  6. 'SUCCESS'
  7. >>> result = reverse.delay('Pretty Printed')
  8. >>> result.ready() # 未收到資料,因此顯示 False
  9. False
  10. >>> result.ready() # 已收到資料,因此顯示 Ture
  11. True
  12. >>> result.get() # 顯示收到的資料
  13. 'detnirP ytterP'
  14. >>>

輸入過程中可以同時觀察執行 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)

留言