Flask Multiprocessing

1

Я пытаюсь разработать небольшое приложение, которое будет в основном строить некоторые графики на основе набора данных, предоставленных или запрошенных пользователем данных. Функция process_order должна запускаться одновременно с другим набором данных. По какой-то причине я получаю только первый график не второй, а второй. Я открыл другой сеанс браузера с другим пользователем, получившим тот же результат.

Пример. Я попытался открыть браузер из IE, а другой из Chrome, зарегистрированный как user1 с набором из 5 входов - в IE (ожидаемые 5 графиков) и как user2 с набором из 20 входных данных - в Chrome (ожидаемые 20 графиков) я ожидал 2 окна браузера с 5 графиками из одного и 20 графиков из второго окна:

Я новичок в python и флягах извинения, если его что-то уже задали/ответили в разных вопросах

app = Flask(__name__)
plot = None
my_session = None
session_id = None

@app.route('/')
def home():
    if not session.get('logged_in'):
        return render_template('login.html')
    else:
        return render_template('template.html')

@app.route('/login', methods=['POST'])
def do_admin_login():

    if request.form['password'] == 'password' and request.form['username'] in 'admin' :
        session['logged_in'] = True
        my_session = Bot(request.form['username'])
        my_session.session_id = request.form['username']
        session['user'] = request.form['username']
        return render_template('template.html')
    else:
        flash('wrong password!')
    return home()

@app.route("/ask", methods=['POST','GET'])
def ask():

    string = str(request.form['message'])

    res = my_session.process(string)
    return jsonify({'status':'OK','answer':bot_res})


class Bot():
    #Define user level 
    def __init__(self,session_id):
      self.return_string = ""
      self.session_id = session_id

    def process(self, string):
        self.session_id = session['user']
        self.string = string
        self.return_string = self.process_order() #  This method I would like to execute as concurrent at the same time for multiple users/session with different set ot data
        return self.return_string

    def process_order(self):

        self.plot = Plot()
        self.plot.global_url = range(5)
        self.i = 0
        self.inputs = [] #tuples
        self.number = range(5)

        self.url_values = zip(self.number,self.inputs)

        self.pool = Pool()
        self.func = partial(self.plot.do_plot,self.var1)
        self.pool.map(self.func,self.url_values)
        self.pool.close()
        self.pool.join()

        process_confirmation = "Your request is complete"
        return process_confirmation


class Plot():

    def __init__(self):
        pass
    def do_plot(self, var1):

        self.number, self.url = plot_values
        self.var1 = var1

        fig = plt.figure(self.number)
        self.line = str(self.url[1])

        self.res  = urllib.request.urlopen(self.line)
        plt.imshow(plt.imread(self.res))

        self.file_name = "%03d.png"%(self.number,)
        plt.savefig(self.file_name)

        plt.close()

if __name__ == "__main__":
    session_id = None
    app.secret_key = os.urandom(12)
    my_session = Bot(session_id)
    app.run(host='0.0.0.0', port=80)
Теги:
flask
multiprocessing

1 ответ

0

Если проблема возникает, так это то, что отдельные запросы занимают много времени, тогда ваша проблема может возникнуть из-за использования встроенных в колбу серверов.

Вы можете попробовать установить приложение с помощью gevent: http://flask.pocoo.org/docs/1.0/deploying/wsgi-standalone/#gevent

  • 0
    Нет. Если я выполняю запрос по одному, я могу получить ответ, каждый из которых занимает менее 15 секунд или около того. Проблема, я вижу это или думаю, в то время как первый запрос находится в процессе обработки данных второго запроса, где некоторые перекрываются с первым и таким образом приведенным графиком. Мне просто нужен какой-то дополнительный глаз или направление, правильно ли я использую переменные экземпляра класса. Спасибо за ваш вклад

Ещё вопросы

Сообщество Overcoder
Наверх
Меню