2013-11-24 2 views
6

Я новичок в python flask REST веб-сервисов. Я пытаюсь создать веб-службу отдыха, которая будет иметь общую очередь, несколько потоков будут постоянно записываться в эту очередь на стороне сервера, и, наконец, когда пользователь вызывает методы GET, служба должна возвращать первый элемент в общей очереди.Как использовать общие очереди с флагом python Restful web services

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

from flask import Flask 
app = Flask(__name__) 

count= 0 #Shared Variable 

@app.route("/") 
def counter(): 
    count = count+1 
    return {'count':count} 

if __name__ == "__main__": 

    app.run() 

Но даже выше код не работает. Затем я использую кеш для общей переменной, но это не будет правильным способом реализации общей очереди (моя конечная цель). Пожалуйста, дайте мне ваши советы

ответ

6

Я боюсь, что вещь, которую вы хотите сделать, немного сложнее этого.

Флажок (и другие системы python WSGI) не работают в одном потоке - им, как правило, нужно будет создавать несколько потоков и экземпляров, чтобы справляться с запросами, входящими без блокировки, или без нескольких запросов, обращающихся к одной и той же первой задаче ' в то же время. Таким образом, глобальные переменные не работают, как в других простых однопоточных сценариях python.

Для доступа к одной и той же одиночной очереди данных вам необходим способ для разных процессов.

Обычно это означает аутсорсинг очереди данных во внешней базе данных. Одним из популярных вариантов является Redis. Там хорошее введение в колбу и Redis для именно это:

http://flask.pocoo.org/snippets/73/

Я надеюсь, что это поможет вам в правильном направлении!

1

У вас есть пара ошибок в вашем примере. Вот версия, которая работает:

from flask import Flask, jsonify 
app = Flask(__name__) 

count= 0 #Shared Variable 

@app.route("/") 
def counter(): 
    global count 
    count = count+1 
    return jsonify({'count':count}) 

if __name__ == "__main__": 
    app.run() 

две проблемы, которые вы имеете в вашей версии являются:

  • Вы пропустили объявить count как глобальный в функции зрения. Без глобального объявления функция view создает локальную переменную с тем же именем.
  • Ответ, возвращаемый функцией просмотра, не может быть словарем, он должен быть строкой или объектом Response. Я исправил это с помощью jsonify(), чтобы преобразовать dict в строку JSON.

Но обратите внимание, что этот способ создания общей ценности не является надежным. В частности, обратите внимание, что если вы запустите это приложение под веб-сервером, который создает несколько процессов, то каждый процесс будет иметь свою собственную копию значения count.

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

+0

Так же процедура такая же, если я хочу реализовать общую очередь (а не целочисленную переменную)?. На данный момент я подумываю использовать рассол для хранения общей очереди после каждого запроса на получение и предоставить доступ к ней через синхронизированный блок. Но если я предоставил доступ к очереди через синхронизированный блок, он не будет функционировать хорошо с одновременными множественными запросами (каждый запрос должен будет ждать, пока он не получит возможность войти в синхронизированный блок). что ты думаешь ?(моя конечная цель - реализовать общую очередь) – Proceso

+0

Прочтите мой ответ еще раз, это нехорошее решение. Вместо этого используйте базу данных, легкий, такой как Redis, будет хорошим для этого. – Miguel

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