Я замечаю, что когда параллельные запросы изменяют Flask session
, записываются только некоторые ключи. Это происходит как с сеансом cookie Flask по умолчанию, так и с Flask-Session, использующим бэкэнд Redis. Проект не новый, но это стало заметно только тогда, когда в один и тот же сеанс одновременно поступало много запросов.
import time
from flask import Flask, session
from flask_session import Session
app = Flask(__name__)
app.secret_key = "example"
app.config["SESSION_TYPE"] = "redis"
Session(app)
@app.route("/set/<value>")
def set_value(value):
"""Simulate long running task."""
time.sleep(1)
session[value] = "done"
return "ok\n"
@app.route("/keys")
def keys():
return str(session.keys()) + "\n"
Следующий скрипт оболочки демонстрирует проблему. Обратите внимание, что все запросы выполнены, но в итоговом списке присутствует только один ключ, и он отличается в разных тестовых прогонах.
#!/bin/bash
# set session
curl -c 'cookie' http://localhost:5007/keys
# run parallel
curl -b 'cookie' http://localhost:5007/set/key1 && echo "done1" &
curl -b 'cookie' http://localhost:5007/set/key2 && echo "done2" &
curl -b 'cookie' http://localhost:5007/set/key3 && echo "done3" &
wait
# get result
curl -b 'cookie' http://localhost:5007/keys
$ sh test.sh
dict_keys(['_permanent'])
ok
ok
ok
done3
done1
done2
dict_keys(['_permanent', 'key2'])
$ sh test.sh
dict_keys(['_permanent'])
ok
done3
ok
ok
done2
done1
dict_keys(['_permanent', 'key1'])
Почему не все ключи присутствуют после завершения запросов?