2016-10-17 8 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に与えるにはどうすればよいですか?

EDIT:最初の質問に正しく言わなかった。各作業員はmain()を実行する必要があり、したがって、独自のアプリケーションコンテキストでmodel_loaderにアクセスする必要があります。しかし、私はこれを英雄で実行すると、AttributeError: '_AppCtxGlobals' object has no attribute 'model_loader'が得られます。ヒーローでアプリケーションのコンテキストが異なりますか?

答えて

0

Herokuのワーカーは完全に異なるマシン上にある可能性があるため、メモリに一度ロードすることはできません。すべてのワーカーでこのコードを実行するか、データをどこかのプロセスで読み取れる場所に格納する必要があります。

+0

私は最初の質問に改めて言いました。私は労働者の間でモデルを共有する必要はありません。しかし、労働者は主人公の「メイン」にロードされた変数にアクセスできないように見える。 – LateCoder

+0

ここからmainを呼び出していますか? –

+0

私はこのようにスクリプトを実行するProcfileを持っています: 'web:gunicorn server:app'。スクリプトには、元の投稿に示されているように 'main()'の呼び出しが含まれています。 – LateCoder

関連する問題