2015-10-06 51 views
7

Tôi đã theo dõi tutorial của Flask-Cache và cố gắng tự thực hiện. Đưa ra ví dụ sau, tại sao Flask không cache thời gian?Bộ nhớ cache trong bộ nhớ cache không lưu vào bộ nhớ cache

from flask import Flask 
import time 

app = Flask(__name__) 
cache = Cache(config={'CACHE_TYPE': 'simple'}) 
cache.init_app(app) 

@app.route('/time') 
@cache.cached(timeout=50, key_prefix='test') 
def test(): 
    return time.ctime() 

Đầu ra luôn là thời gian hiện tại.

Dường như bộ nhớ cache được tạo lại theo từng yêu cầu. Tôi đang làm gì sai?

Edit: Tôi thực hiện python-file sau đây với Python 2.7.6:

def runserver(): 
    port = int(os.environ.get('PORT', 5000)) 
    Triangle(app) 
    app.run(host='0.0.0.0', port=port, processes=5) 


if __name__ == '__main__': 
    runserver() 
+0

Tôi không thể tạo lại điều này; khi chạy với Flask với máy chủ phát triển 'app.run()' được đóng gói, thời gian được lưu trữ. Làm thế nào bạn đang chạy này? –

+0

Lưu ý rằng 'SimpleCache' là * từ điển toàn cục *. Nếu bạn đang sử dụng một máy chủ WSGI sử dụng đa xử lý để mở rộng quy mô, bạn sẽ nhận được các bản sao riêng biệt và chúng sẽ xuất hiện không để bộ nhớ cache. –

+0

Cảm ơn Martijn, tôi đang chạy nó cục bộ và không triển khai nó đến bất kỳ máy chủ wsgi nào. Tôi đã thêm bản thảo của tôi – Frame91

Trả lời

14

Bạn đang sử dụng SimpleCache thiết lập:

cache = Cache(config={'CACHE_TYPE': 'simple'}) 

này sử dụng một cuốn từ điển toàn cầu duy nhất để giữ bộ nhớ cache , và điều này sẽ chỉ hoạt động nếu bạn đang sử dụng một máy chủ WSGI sử dụng một trình thông dịch Python để phục vụ tất cả các yêu cầu WSGI của bạn. Nếu bạn sử dụng một máy chủ WSGI sử dụng các tiến trình con riêng biệt để xử lý các yêu cầu, bạn sẽ nhận được một bản sao mới của từ điển đó mỗi lần và không có gì được lưu trữ một cách hiệu quả.

Mã hoạt động tốt khi chạy với máy chủ phát triển được xây dựng trong app.run(), vì bạn không sử dụng đối số processes.

Bản cập nhật của bạn cho thấy rằng bạn chạy máy chủ với các quy trình riêng biệt. Mỗi quá trình sẽ nhận được từ điển riêng của nó và bộ nhớ cache không được chia sẻ giữa chúng. Thay vào đó, hãy sử dụng phụ trợ bộ nhớ đệm khác, chẳng hạn như filesystem:

cache = Cache(config={'CACHE_TYPE': 'filesystem', 'CACHE_DIR': '/tmp'}) 
+0

Bạn đã đúng! Tôi phải thay đổi điều gì nếu tôi muốn giữ nguyên đối số của quy trình? – Frame91

+0

Sử dụng một chương trình phụ trợ khác, một chương trình phụ có thể được chia sẻ giữa các quy trình. Hệ thống tập tin 'là một hệ thống không yêu cầu phụ thuộc bổ sung. –

+1

Cảm ơn bạn rất nhiều vì câu trả lời hoàn hảo! Tôi sẽ không tự mình tìm ra được! – Frame91

Các vấn đề liên quan