Уведомления

Группа в Telegram: присоединиться | Jabber-конференция сообщества: pythonua@conference.jabber.ru

#1 Май 17, 2017 16:28:59

bal
Зарегистрирован: 2017-05-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

Задача простейшая! Делаю на bottle отчеты из Oracle. Результаты посылаю в XLS. Все работает. Вот только при тяжелых запросах браузер повисает(ожидание). Хочется вывести “Ждите…”, а там пусть крутится хоть сутки.
Оказалось не так просто. Посмотрел https://bottlepy.org/docs/dev/async.html. Использовал gevent-сервер.

@route('/stream')
def stream():
yield ‘START’
sleep(3)
yield ‘MIDDLE’
sleep(5)
yield ‘END’

Пример работает, хотя тоже не совсем адекватно. Так между
START и MIDDLE задержки нет. Подставляю вместо sleep(3) свой запрос, повисает, затем выводит сразу ВСЁ!
Как сначала вывести “Ждите…”, а затем повесить сервер?!
Спасибо!

Офлайн

#2 Май 17, 2017 19:40:43

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 274
Репутация: +  10  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

Так никто не делает.
Это тяжелые запросы и они должны выполнятся как отдельный процесс.
Рекомендую глянуть в сторону RQ.
Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд состояние задания.

Офлайн

#3 Май 17, 2017 21:27:02

bal
Зарегистрирован: 2017-05-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

>Рекомендую глянуть в сторону RQ.

Спасибо! Вот только еще бы подсказали, что такое RQ.

>Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд >состояние задания.

Ну, по-простому, конечно, можно было все организовать через файл-семафор. Хотелось все решить средствами сервера.

Офлайн

#4 Май 17, 2017 21:28:46

bal
Зарегистрирован: 2017-05-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

>Рекомендую глянуть в сторону RQ.

Спасибо! Вот только еще бы подсказали, что такое RQ.

>Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд >состояние задания.

Ну, по-простому, конечно, можно было все организовать через файл-семафор. Хотелось все решить средствами сервера.

Офлайн

#5 Май 18, 2017 09:51:55

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 274
Репутация: +  10  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

RQ

Офлайн

#6 Май 18, 2017 10:30:50

bal
Зарегистрирован: 2017-05-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

Спасибо! Смотрю, интересно

Офлайн

#7 Май 18, 2017 11:09:20

bal
Зарегистрирован: 2017-05-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

Вычитал на https://khashtamov.com/ru/python-rq-howto/
Под Windows RQ работать не будет, так как полагается на механизм fork для порождения процессов, выполняющих задачи. Если вы используете Windows, то можно воспользоваться Vagrant для выполнения кода на виртуальной машине под управлением, например, Ubuntu 16.04 LTS…
А у меня как раз на винде все крутится

Офлайн

#8 Май 18, 2017 11:23:39

bal
Зарегистрирован: 2017-05-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

Думаю, рыть в другом направлении
‘eventlet’: EventletServer,
Пробую…

Офлайн

#9 Май 18, 2017 11:48:19

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 274
Репутация: +  10  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

Костыль. Но дело Ваше. Вообще сервер с винды таки придется выносить…

Офлайн

#10 Май 25, 2017 10:30:18

bal
Зарегистрирован: 2017-05-17
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Задержка вывода в bottle

Задачку решил
Использовал просто javascript.
На кнопку повесил событие:
<input type=“submit” name=“doit” value=“Выполнить” onclick=“DOIT_Report()”>
И сама функция:
<SCRIPT LANGUAGE=“JavaScript” TYPE=“text/javascript”>
function DOIT_Report() {

var xhr = new XMLHttpRequest();

xhr.open('GET', ‘/doit_oracle_sql/{{subj}}’, true);
xhr.send();
document.body.innerHTML += // Доролняем содержимое BODY!
‘<h2>Ждите…</h2><img src=“./static/ajax-loader.gif”><img src=“./static/morda.gif”><img src=“./static/yes.gif”>’

xhr.onreadystatechange = function() {
if (xhr.readyState != 4) return;

button.innerHTML = ‘Готово!’;

if (xhr.status != 200) {
// обработать ошибку
alert(xhr.status + ‘: ’ + xhr.statusText);
} else {
// вывести результат
document.body.innerHTML = // Заменяем содержимое BODY!
xhr.responseText;
}
}
button.innerHTML = ‘Ждите…’;
button.disabled = true;
}
</SCRIPT>

Удачи всем!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version