LINUX.ORG.RU

как правильно ждать?

 ,


1

1

Нужно дождаться пока (речь про python-RQ) job.is_finished не станет True и затем отдавать ответ на страницу. Как это правильно написать?
Не делать же так (или делать?):

while job.is_finished is False: 
    time.sleep(10)
    if job.is_finished: return json.dumps({'data': job.result}) 

или взять модуль https://pypi.org/project/waiting/ .


затем отдавать ответ на страницу

То есть ты задерживаешь ответ на запрос на неопределённое время? Это реально стрёмная практика. Просто отдавай ответ, что задача ещё не завершилась, а фронтенд пусть делает повторный запрос, пока задача не выполнится.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Подход достаточно старый, называется long polling.

Возможно для данного кейса лучше подойдёт брокер очередей.

serioja
()
Ответ на: комментарий от Crocodoom

Так может случиться ситуация, когда job.is_finished случится после таймаута запроса. Лучше сразу отдавать статус и пусть потом FE обрабатывает.

AlexKiriukha ★★★★
()
Ответ на: комментарий от eternal_sorrow

На стороне пользователя диалог с прогресс баром. В модальном режиме. Т.е. пользователь сделать ничего не может, пока задача не завершится. А как повторный запрос если используется диалог. Или на что тогда заменить этот диалог… Пример бы увидеть.

anonymous
()
Ответ на: комментарий от anonymous

Делаешь запрос на создание жобы, а потом, в случае нормального ответа, начинаешь как-то проверять статус другим запросом. Второе можно сделать миллионом способов: long polling, websocket или просто запросы по таймауту.

creazero
()

В flask нет нормальных решений если тебя не устраивает «заблокировать вот этот wsgi-воркер пока задача не выполнится». Ну, технически, можно накостылять с gevent и его monkeypatch, но это не нормальное решение.

Если устраивает — любое решение будет похоже на то, что у тебя в ОП-посте. Это не вебскейл, тебе нужно будет по отдельному процессу с flask’ом на каждого такого ждущего клиента и с какого-то момента оперативка внезапно кончится. Но если у тебя совсем низкая нагрузка (1 клиент?), то сойдёт.

Вариант решить в обход flask: rq-задача сохраняет результ, у тебя есть отдельный эндпойнт, который выдаёт либо результат, либо «спроси позже» клиенту без всяких time sleep. Типичный поллинг.

Навороты вокруг этого: отдельный эндпойнт сделать async и с веб-сокетами, можно сообщить клиенту, когда задача готова без поллинга, но тогда он будет не в flask. Но всё остальное можно оставить в flask.

x3al ★★★★★
()
Ответ на: комментарий от serioja

rq это уже очереди, пусть и совсем примитивные и прибитые гвоздями к redis.

x3al ★★★★★
()
Ответ на: комментарий от x3al

Всем спасибо, кто не прошел мимо. Вроде дошло, что надо делать.

bikes
() автор топика

Для ожидания нужно принять позу лотоса. Повернуться в направлении Солнца. Руки расслабить и положить на бёдра ладонями вверх. Сложить большие и указательные пальцы. Убедится, что позвоночник ровный. Наблюдать за дыханием, но не контролировать его. Приступить к медитации на одной из 6 чакр на выбор, убедившись, что чакры расположенные ниже раскрыты. Если все 6 чакр раскрыты, то следует заняться оставшимися 106-тью. После чего можно переходить к последним – седьмой и 114-ой. Важно понимать, что при раскрытии 7-ой чакры положение дел с питоновским скриптом более не будет иметь значения. Вот так следует проводить ожидание. В качестве медитативной практики рекомендую следующие мантры. На вдохе мыслено произносишь «я не это тело», на выдохе – «я даже не этот разум». Не забывай следить за общей расслабленностью и прямотой позвоночника. Это всё, что я знаю о том, как проводить ожидание. Удачи.

anonymous
()
Ответ на: комментарий от tz4678

а он чем то координально отличается от rq? Ну кроме того, что один ‘worker’ может одновременно обрабатывать n количество задач.

bikes
() автор топика
Последнее исправление: bikes (всего исправлений: 1)

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

peregrine ★★★★★
()
Ответ на: комментарий от x3al

Вообще можно gunicorn с gevent-воркером просто запустить, и всё будет типа ок. Ну пока в чей-нибудь таймаут не упрется.

ei-grad ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Так, и? Может теперь ради каждого чиха обмазываться реактами, как и делает 99% альтернативно одаренных?

Откуда вы только беретесь, зумерки.

evgeny_aa ★★☆
()
Последнее исправление: evgeny_aa (всего исправлений: 1)
Ответ на: комментарий от evgeny_aa

Там, где тебе не нужен реакт и другие высокоуровневые фреймворки, тебе не нужен и jquery, пиши на чистом js.

eternal_sorrow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.