在以下代码段中,我有一个普通的Flask应用程序,它从另一个python模块(也在下面)中调用一个函数。
我希望使用(例如)Flask-Cache将(慢/昂贵/任意)函数缓存在内存中,以便在请求之间可以使用其数据。我以为数据本身是静态的,但我认为它们是OpenCV关键点检测器对象(例如SIFT,SURF,ORB等),这意味着它们的地址在请求之间不断变化-正是这些对象为缓存。
main.py
:
# Run as
# python main.py
from flask import Flask, jsonify
from flask_cache import Cache
import backer
app = Flask(__name__)
@app.route('/get-result')
def get_result():
cached_results = backer.do_some_work()
return jsonify({'response': cached_results})
if __name__ == "__main__":
app.run(host='localhost', port=8080, debug=True, threaded=True)
在backer.py
中,我有:
import time
from flask import Flask
from flask_cache import Cache
app = Flask(__name__)
cache = Cache(app, config={'CACHE_TYPE': 'simple'})
import cv2
import numpy as np
@cache.cached(timeout=300, key_prefix='all_comments')
def get_all_comments():
comments = range(10000)
time.sleep(2) # do_serious_dbio()
print 'cache complete'
if not cache.get('detector'):
detector = cv2.ORB_create()
cache.set('detector',detector)
else:
detector = cache.get('detector')
return comments, detector
def do_some_work():
cached, detector = get_all_comments()
work_done = [2.0 * c for c in cached]
print detector
image = np.random.randint(255, size=(128, 128, 3), dtype=np.uint8)
kp, des = detector.detectAndCompute(image, None)
return work_done
在第一个请求上,一切都很好:
curl http://localhost:8080/get-result
在第二个请求上,我得到:
kp, des = detector.detectAndCompute(image, None)
TypeError: Incorrect type of self (must be 'Feature2D' or its derivative)
请注意,detector
会在两次请求之间更改其地址,例如
<ORB 0x121976070>
<ORB 0x10fc74fb0>
(i)两者有关系吗?
(ii)Flask是否有办法缓存任意对象,例如OpenCV ORB实例(正确的地址和全部)?或
(iii)我是否必须以某种方式序列化/修改ORB对象的关键点,描述符和其他属性?或
(iv)是否有另一种解决方法,例如Saving OpenCV object in memory in python吗?
一如既往的感谢