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

本文為影片筆記,文中內容與影片不一定完全相同。
Database 資料存取的過程中多少會花費一些時間,網頁通常在存取完成後才會更新網頁,這將影響用戶體驗。
這章節主要是模擬存取過程中,使用 Celery 避免使用者花費時間等待。
接續上一章的代碼
# celery_example.py

from flask import Flask
from flask_celery import make_celery
from flask_sqlalchemy import SQLAlchemy
from random import choice

app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_BACKEND'] = 'db+sqlite:///results.sqlite'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///results.sqlite'  # 選擇資料存取的目的地,不需要加連接驅動的名稱,所以沒有 “db+” 

celery = make_celery(app)
db = SQLAlchemy(app)  # 建立 Flask app 的另一個延伸

class Results(db.Model):  # 建立數據庫
 id = db.Column('id', db.Integer, primary_key=True)
 data = db.Column('data', db.String(50))

@app.route('/process/')
def process(name):
 reverse.delay(name)
 return 'I sent an async request!'

@app.route('/insertData')
def insertData():
 return insert()

@celery.task(name='celery_example.reverse')
def reverse(string):
 return string[::-1]

def insert():
 # for i in xrange(500):  # Python 2
 for i in iter(range(20000)):  # Python 3 。可以增加存取的數據量,增加等待時間。
  data = ''.join(choice('ABCDE') for i in range(10))
  result = Results(data=data)
  db.session.add(result)
 db.session.commit()
 return 'Done!!!'

if __name__ == '__main__':
 db.create_all()  # 不知道什麼原因,我不加這行無法運作
 app.run(debug=True)

執行代碼:
$ python3 celery_example.py
打開網頁 “http://localhost:5000/insertData”,將會發現需要等待一段時間後,網頁才會更新。
資料夾中也會出現 “results.sqlite” 檔,打開可檢視剛存取的數據。
修改代碼:
# celery_example.py

...
@app.route('/insertData')
def insertData():
 insert.delay()  # 將任務加入序列中
 return 'I sent an async request to inser data into the database.'

...

@celery.task(name='celery_example.insert')  # 加入修飾器
def insert():
 ...

執行 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)

留言