[ Celery ] Flask, Celery & SQLAlchemy Example (4/4)

本文為影片筆記,文中內容與影片不一定完全相同。
Database 資料存取的過程中多少會花費一些時間,網頁通常在存取完成後才會更新網頁,這將影響用戶體驗。
這章節主要是模擬存取過程中,使用 Celery 避免使用者花費時間等待。
接續上一章的代碼
  1. # celery_example.py
  2.  
  3. from flask import Flask
  4. from flask_celery import make_celery
  5. from flask_sqlalchemy import SQLAlchemy
  6. from random import choice
  7.  
  8. app = Flask(__name__)
  9. app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
  10. app.config['CELERY_BACKEND'] = 'db+sqlite:///results.sqlite'
  11. app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///results.sqlite' # 選擇資料存取的目的地,不需要加連接驅動的名稱,所以沒有 “db+”
  12.  
  13. celery = make_celery(app)
  14. db = SQLAlchemy(app) # 建立 Flask app 的另一個延伸
  15.  
  16. class Results(db.Model): # 建立數據庫
  17. id = db.Column('id', db.Integer, primary_key=True)
  18. data = db.Column('data', db.String(50))
  19.  
  20. @app.route('/process/')
  21. def process(name):
  22. reverse.delay(name)
  23. return 'I sent an async request!'
  24. @app.route('/insertData')
  25. def insertData():
  26. return insert()
  27. @celery.task(name='celery_example.reverse')
  28. def reverse(string):
  29. return string[::-1]
  30. def insert():
  31. # for i in xrange(500): # Python 2
  32. for i in iter(range(20000)): # Python 3 。可以增加存取的數據量,增加等待時間。
  33. data = ''.join(choice('ABCDE') for i in range(10))
  34. result = Results(data=data)
  35. db.session.add(result)
  36. db.session.commit()
  37. return 'Done!!!'
  38. if __name__ == '__main__':
  39. db.create_all() # 不知道什麼原因,我不加這行無法運作
  40. app.run(debug=True)

執行代碼:
$ python3 celery_example.py
打開網頁 “http://localhost:5000/insertData”,將會發現需要等待一段時間後,網頁才會更新。
資料夾中也會出現 “results.sqlite” 檔,打開可檢視剛存取的數據。
修改代碼:
  1. # celery_example.py
  2.  
  3. ...
  4. @app.route('/insertData')
  5. def insertData():
  6. insert.delay() # 將任務加入序列中
  7. return 'I sent an async request to inser data into the database.'
  8.  
  9. ...
  10.  
  11. @celery.task(name='celery_example.insert') # 加入修飾器
  12. def insert():
  13. ...

執行 Celery:
$ celery -A celery_example.celery worker --loglevel=info
Celery 執行畫面將會多出一個可加入序列中的任務。


重新執行代碼後,會發現網頁會先被更新,但在 Celery 的執行畫面中仍然在存取資料,等待一段時間後就會顯示 “Done!!!”。
接著就會發現 “results.sqlite” 的資料被更新了。

老實說,連接驅動說實話我不知道是什麼意思,只知道要這麼做......
到目前為止 Celery 在 Flask 應該能輕鬆應用了,這樣的功能除了在存取數據上,也可以將機器學習加入網站中。
減少訓練模型或預測數據上消耗的時間,影響用戶體驗。

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)

留言