驻留在弹性beantalk烧瓶中的应用程序之前运行代码

时间:2019-08-07 22:36:38

标签: python amazon-web-services tensorflow flask amazon-elastic-beanstalk

我正在使用Elastic beanstalk作为托管在Elastic beanstalk上的端点api。我需要先运行一些设置代码,然后才能调用api端点,以便它们更快返回。但是出于某种原因,无论我把它放在哪里,代码都永远不会运行。

下面的代码并不完全是我所拥有的,因为我无法全部显示,但是它可以模拟我所遇到的问题。似乎从未调用过函数setup_flask(),因为没有一个打印语句在弹性beantalk输出中运行。端点应答器被调用时,我的程序出错,因为sess从未初始化。

import tensorflow as tf
from flask import Flask, jsonify
import pandas as pd
import tensorflow_hub as hub
import os

sess = None

def setup_flask():
        print('Starting setting up flask')
        global sess
        global embedding_fun
        global sentences_ph
        global df
        embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder-large/3")
        sentences_ph = tf.placeholder(dtype=tf.string, shape=[None])
        embedding_fun = embed(sentences_ph)
        sess = tf.Session()
        sess.run([tf.global_variables_initializer(), tf.tables_initializer()])



class MyFlaskApp(Flask):
    def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
        print("flask.run() is running")
        setup_flask()
        print('Setup complete')
        super(MyFlaskApp, self).run(host=host, port=port, debug=debug, load_dotenv=load_dotenv, **options)



print('Starting application')
application = MyFlaskApp(__name__)

if __name__ == "__main__":
    print("starting main")
    application.run()



@application.route('/answerer/<question>',methods=['GET'])
def get_response(question):
    global sess
    global embedding_fun
    global sentences_ph
    global df
    sentence_vector = sess.run(embedding_fun, feed_dict={sentences_ph: [question]})
    return sentence_vector

我唯一的想法可能是setup_flask()实际上是在其他上下文中运行的。但是,我尝试过将其移动,但没有任何效果。如果有更好的方法可以在flask部署上进行这种初始化,请告诉我。我知道代码有点混乱,只是为了使它正常工作,我真的搞砸了。

0 个答案:

没有答案