我正在用烧瓶。我定义了一些路由,这些路由很昂贵,因为它们需要访问数据库并进行冗长的计算。数据库连接依赖于Flask-Mongoengine扩展,该扩展依赖于不是线程安全的PyMongo。
因此,我的想法如下:
@blueprint.route("/refresh/data", methods=['GET'])
def refresh_data():
cache.clear()
with Pool(4) as p:
print(p.map(func=f, iterable=["recently", "mtd", "ytd", "sector"]))
获取一个小池并调用函数f。函数f基于
def f(name):
print(current_app.extensions)
print(current_app.config)
current_app.extensions["mongoengine"] = MongoEngine(app=current_app)
print(current_app.extensions)
get(address="reports/{path}/json".format(path=name))
get(address="reports/{path}/html".format(path=name))
return name
这里的问题是,无法再次初始化MongoEngine的init_app。实际上,扩展只能被初始化一次,但是在多个线程上需要扩展而不是线程安全又会发生什么呢?