發表文章

目前顯示的是 5月, 2017的文章

[ Redis ] 關閉當掉的 Redis所佔用的頻道

使用 Redis 時,電腦出現異常導致 Redis 服務關閉,但卻仍然佔用頻道。 $ ps -ef|grep redis 501 2408 1931 0 4:01上午 ttys001 0:00.04 src/redis-server *:6379 501 2422 2411 0 4:02上午 ttys002 0:00.00 grep redis $ src/redis-cli # 和 src/redis-server 在相同路徑 127.0.0.1:6379> shutdown save not connected> quit $ 透過該方法就可以重新啟動 Redis 。

[ 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 ] 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)

[ Celery ] Asynchronous Task in Flask Using Celery (3/4)

圖片
本文為影片筆記,文中內容與影片不一定完全相同。 建立 Flask 官網 提供,整合 Celery 和 Flask 的代碼: # flask_celery.py from celery import Celery def make_celery(app): celery = Celery(app.import_name, backend=app.config['CELERY_BACKEND'], broker=app.config['CELERY_BROKER_URL']) celery.conf.update(app.config) TaskBase = celery.Task class ContextTask(TaskBase): abstract = True def __call__(self, *args, **kwargs): with app.app_context(): return TaskBase.__call__(self, *args, **kwargs) celery.Task = ContextTask return celery 建立 Flask 後端: # celery_example.py from flask import Flask from flask_celery import make_celery app = Flask(__name__) app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0' # 使用 Redis 緩存器 app.config['CELERY_BACKEND'] = 'redis://localhost:6379/0' # 也使用 Redis 作為訊息記錄器 celery = make_celery(app) # 建立 Flask app 的延伸 @app.route("/process/ ") def process(

[ Celery ] Asynchronous Tasks in Python - Getting Started With Celery (1/4)

圖片
本文為影片筆記,文中內容與影片不一定完全相同。 Celery 有三點需要注意: Client app: Your app is going to have something that I wants to call asynchronously(異步). Message queue: Place it on the message queue. Celery: App, message and celery are running. 安裝 RabbitMQ: $ apt-get install rabbitmq-server # 安裝 $ server rabbitmq-server start # 啟動 $ rabbitmqctl status # 檢視狀態 安裝 Redis: 我使用的是Redis,所以我就沒有安裝 RabbitMQ 了。Redis安裝也很簡單,想使用 Redis 請參考 官網 。 Redis 的執行畫面 安裝 Celery: $ pip3 install celery 建立 App: # tasks.py from celery import Celery # 使用 RabbitMQ: # app = Celery('tasks', broker='amqp://localhost//') # 使用 Redis: app = Celery('tasks', broker='redis://localhost:6379/0') @app.task # 建立 Celery 可添加的任務任務 def reverse(string): return string[::-1] 啟動 Celery: $ celery -A tasks worker --loglevel=info Celery 的執行畫面,並發現可以加入行程中的任務。 測試 Celery: >>> from tasks import * >>> reverse.delay('Anthony') # delay 方法, Celery 將會將該任務添加至序列中 你將會在 Redis