Форум сайта python.su
Задача простейшая! Делаю на 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) свой запрос, повисает, затем выводит сразу ВСЁ!
Как сначала вывести “Ждите…”, а затем повесить сервер?!
Спасибо!
Офлайн
Так никто не делает.
Это тяжелые запросы и они должны выполнятся как отдельный процесс.
Рекомендую глянуть в сторону RQ.
Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд состояние задания.
Офлайн
>Рекомендую глянуть в сторону RQ.
Спасибо! Вот только еще бы подсказали, что такое RQ.
>Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд >состояние задания.
Ну, по-простому, конечно, можно было все организовать через файл-семафор. Хотелось все решить средствами сервера.
Офлайн
>Рекомендую глянуть в сторону RQ.
Спасибо! Вот только еще бы подсказали, что такое RQ.
>Со стороны клиента желательно приделать какой-то механизм, который бы спрашивал через Х секунд >состояние задания.
Ну, по-простому, конечно, можно было все организовать через файл-семафор. Хотелось все решить средствами сервера.
Офлайн
Офлайн
Спасибо! Смотрю, интересно
Офлайн
Вычитал на https://khashtamov.com/ru/python-rq-howto/
Под Windows RQ работать не будет, так как полагается на механизм fork для порождения процессов, выполняющих задачи. Если вы используете Windows, то можно воспользоваться Vagrant для выполнения кода на виртуальной машине под управлением, например, Ubuntu 16.04 LTS…
А у меня как раз на винде все крутится
Офлайн
Думаю, рыть в другом направлении
‘eventlet’: EventletServer,
Пробую…
Офлайн
Костыль. Но дело Ваше. Вообще сервер с винды таки придется выносить…
Офлайн
Задачку решил
Использовал просто 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>
Удачи всем!
Офлайн