2016-10-17 42 views
0

我具有長頸瓶的應用程序有一個端點,就像這樣(以下簡化):共享跨請求全球信息到燒瓶端點在Heroku

@app.route('/classify', methods=['POST']) 
def classify(): 
    p = g.model_loader.get_model() 
    json = request.get_json() 
    text = json['text'] 
    return p.classify(text) 


def main(): 
    model_loader = ResourceLoader() 
    with app.app_context(): 
     g.model_loader = model_loader 
     app.run() 


if __name__ == '__main__': 
    main() 

應用程序需要加載一個機器學習模型到內存中一次, main方法,然後使用該模型對通過POST發送到燒瓶端點的文本進行分類。我試圖用一個應用程序上下文來完成這個工作,它在本地工作,但不適用於heroku。我目前的理解是,這是因爲應用程序上下文不在工作人員之間共享。我怎樣才能讓classify端點訪問模型加載器?

編輯:我沒有正確地說出最初的問題。每個工作人員應運行main(),因此應該在其自己的應用程序上下文中訪問model_loader。然而,當我在heroku上運行這個時,我得到了AttributeError: '_AppCtxGlobals' object has no attribute 'model_loader'。 heroku上的應用程序環境是否有所不同?

回答

0

因爲Heroku工作人員可能位於完全不同的機器上,所以不能將其加載到內存中一次。您需要在每個工作人員中運行該代碼,或者將數據存儲在任何進程可以讀取的地方。

+0

我重新措辭我的第一個問題。我不需要在工人中分享模型。但是,工人似乎無法訪問他們在heroku上的'main'中加載的變量。 – LateCoder

+0

你在哪裏給main調用? –

+0

我有一個運行腳本的Procfile,如下所示:'web:gunicorn server:app'。該腳本包含對main()的調用,如原始文章所示。 – LateCoder