1

В этом приложении Flask страница вызывает check() каждые 2 секунды и выводит текущий app.config['count'] на стандартный вывод. Также есть кнопка, которая вызовет процесс и добавит его к глобальному счету - при проверке изнутри одной и той же функции он работает правильно, но когда check() пытается, он всегда застревает в 0.Глобальная переменная не сохраняется корректно, если она задана в Process()

Кто-нибудь знает, что не так Вот? Сон в do_adding_stuff() просто заполнитель для других вещей, которые я буду делать, прежде чем добавлять в счет.

from flask import Flask, redirect, url_for 
from time import sleep 
from multiprocessing import Process 

app = Flask(__name__) 
app.config['count'] = 0 

def do_adding_stuff(): 
    sleep(4) 

    print 'previous count: ' + str(app.config['count']) 
    app.config['count'] =+ 1 
    print 'new count: ' + str(app.config['count']) 


@app.route('/') 
def index(): 
    return """ 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js"></script> 
<script> 
var a = setInterval(function(){ 
    $.post("/check", {"dummy": "data"}) 
}, 2000) 
</script> 
<form method="post" action="add"> 
<input type="submit" value="add 1 to count"> 
</form> 
""" 

@app.route('/add', methods=['POST']) 
def add(): 
    proc = Process(target=do_adding_stuff) 
    proc.start() 

    return redirect(url_for('index')) 

@app.route('/check', methods=['POST']) 
def check(): 
    print('check(): ' + str(app.config['count'])) 
    return '' 

if __name__ == '__main__': 
    app.run(debug=True) 

И выход:

check(): 0 
check(): 0 
check(): 0 
check(): 0 
previous count: 0 
new count: 1 
check(): 0 
check(): 0 

ответ

3

Вы используете отдельные процессы. Когда вы это делаете, нет такой вещи, как глобальная переменная.

Перейти к теме (предупреждение: блокировка интерпретатора Python делает потоки довольно неэффективными) или использовать многопроцессорную обработку. Значения: см. http://docs.python.org/2/library/multiprocessing.html.

Примечание: вам необходимо защитить обновление этого значения с помощью блокировки. В противном случае вы потеряете некоторые обновления.

Смежные вопросы