2015-04-08 4 views
6

Я пытаюсь сделать длинный опрос с помощью JQuery и Python под флягой Framework.Длинный опрос в Python с флягой

Сделав длинный опрос, прежде чем в PHP, я пытался это сделать таким же образом:

Сценарий/функция, которая имеет какое-то время (правда) цикл, проверка изменений периодически eg.every 0 , 5 секунд в базе данных и возвращает некоторые данные при изменении.

Итак, в моем ini .py Я создал app.route для/poll для вызова JQuery. JQuery дает ему некоторую информацию о текущем состоянии клиента, а функция poll() сравнивает это с тем, что в настоящее время находится в базе данных. Цикл завершается и возвращает информацию, когда наблюдается изменение.

Вот код питона:

@app.route('/poll') 
def poll(): 
client_state = request.args.get("state") 

    #remove html encoding + whitesapce from client state 
    html_parser = HTMLParser.HTMLParser() 
    client_state = html_parser.unescape(client_state) 
    client_state = "".join(client_state.split()) 

    #poll the database 
    while True: 
     time.sleep(0.5) 
     data = get_data() 
     json_state = to_json(data) 
     json_state = "".join(data) #remove whitespace 

     if json_state != client_state: 
      return "CHANGE" 

Проблема заключается в том, что, когда над кодами начинают опрашивать сервер оказывается перегруженным и другие Ajax звонков, и другие запросы, такие как загрузки «загрузка» изображение в html, использующий JQuery, не отвечает и тайм-аут.

Ради ЗАВЕРШЕНИЕ, я уже включил JQuery здесь:

function poll() { 

queryString = "state="+JSON.stringify(currentState); 

$.ajax({ 
    url:"/poll", 
    data: queryString, 
    timeout: 60000, 
    success: function(data) { 
     console.log(data); 
     if(currentState == null) { 
      currentState = JSON.parse(data); 
     } 
     else { 
      console.log("A change has occurred"); 
     } 

     poll(); 

    }, 
    error: function(jqXHR, textStatus, errorThrown) { 

     console.log(jqXHR.status + "," + textStatus + ", " + errorThrown); 

     poll(); 

    } 
}); 

} 

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

Спасибо заранее! :)

+5

См. Http://stackoverflow.com/questions/14814201/can-i-serve-multiple-clients-using-just-flask-app-run-as-standalone –

ответ

3

Точно так же, как link @ Robᵩ упомянуто, вы используете флешку, это просто перегрузка. Это связано с тем, что приложение-фляга по умолчанию работает в режиме одиночной резьбы при работе с app.run(), поэтому он может обслуживать только один запрос за раз.

Вы можете начать много поточность с:

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

Или с помощью сервера WSGI как gunicorn или uwsgi служить колбу с несколькими обработки:

gunicorn -w 4 myapp:app 

Hopes вы наслаждаетесь с Python и термос !

+1

В целом, хотя приложения WSGI не подходят долго опрос в любом виде, хотя то же самое относится и к PHP. Это связано с тем, что оба Python при использовании WSGI и PHP являются синхронными системами и требуют обработки или потока для обработки каждого запроса. Таким образом, для обработки большого количества одновременных запросов на длительный опрос вам требуется большая емкость (процессы или потоки). Длительный опрос лучше реализован с использованием асинхронного веб-сервера и фреймворка. –

+0

Альтернативой, если использовать стрельбу, является использование сопрограмм через агентов eventlet или gevent. Выполнение этого, хотя и делает множество ограничений для вашего приложения, так как вы можете использовать только клиенты для бэкэнд-услуг и баз данных, которые известны корпорацией, чтобы избежать блокирования всего процесса. Так что сопрограммы - это не просто волшебство, которое делает все хорошо. –

+0

@GrahamDumpleton Да, асинхронный сервер хотел бы, чтобы Tornado был намного лучше, и обычно это мой первый выбор для построения API или сервера WebSocket. – kxxoling

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