Задать вопрос

Как сделать в Flask rest api паралельные запросы?

Я не очень как сделать паралельные запросы к REST API (на Flask) в python и избежать проблемы одновременных обращений.
Беру flask.pocoo.org/docs/0.10/quickstart и строю простой flow:
from flask import Flask, jsonify, make_response, abort,request
import time
app = Flask(__name__)

tasks = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
        'done': False
    },
    {
        'id': 2,
        'title': u'Learn Python',
        'description': u'Need to find a good Python tutorial on the web',
        'done': False
    }
]

@app.route("/")
def hello():
    time.sleep(100)
    return "Hello World!"

@app.route('/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = filter(lambda t: t['id'] == task_id, tasks)
    if len(task) == 0:
        abort(404)
    if task_id==2:
        print "sleeping..."
        time.sleep(1000)
    return jsonify({'task': task[0]})

@app.route('/tasks', methods=['POST'])
def create_task():
    if not request.json or not 'title' in request.json:
        abort(400)
    task = {
        'id': tasks[-1]['id'] + 1,
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
    }
    tasks.append(task)
    return jsonify({'task': task}), 201

@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)

if __name__ == "__main__":
    app.debug = True
    app.run(host='0.0.0.0',port=8888)


Добавляю time.sleep(1000), что бы просимулировать медленный ответ REST API
@app.route('/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = filter(lambda t: t['id'] == task_id, tasks)
    if len(task) == 0:
        abort(404)
    if task_id==2:
        print "sleeping..."
        time.sleep(1000)
    return jsonify({'task': task[0]})

и тут начинаются проблемы:
я паралельно запросил curl -i localhost:8888/tasks/2 и curl -i localhost:8888/tasks/1, при этом нет ответа от этих двух запросов.

#python flask/example.py
* Running on http://0.0.0.0:8888/
 * Restarting with reloader
127.0.0.1 - - [21/Jan/2015 14:06:47] "GET /tasks/3 HTTP/1.1" 404 -
127.0.0.1 - - [21/Jan/2015 14:06:51] "GET /tasks/1 HTTP/1.1" 200 -
sleeping...


Подскажите как решается проблема с паралельными запросами?
  • Вопрос задан
  • 4332 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
crazyzubr
@crazyzubr
Python backend-developer
Вы запускаете веб-сервер в однопоточном режиме. Пока не завершится один запрос, другой не пройдет. Нужно настроить gunicorn+nginx, например. Есть и другие варианты.
Ответ написан
@xzfallen
Может поможет книга Разработка веб-приложений с использованием Flask на языке Python my-files.ru/tol0cr
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы