Страница 1 из 2

Получение output таска через API

Добавлено: Ср июн 13, 2018 12:24 pm
paulwinex
Хочу получать Output таска в процессе рендера. Использую такой код (взято из WebGUI)

Код: Выделить всё

cmd = af.Cmd()
cmd.data = {"type": "jobs", "ids": [2], "mode": "log", "block_ids": [0], "task_ids": [0]}
cmd.action = 'get'
result = cmd._sendRequest()
Этот код делает почти всё верно, только он ничего не возвращает пока таск не завершится. И только потом выдаёт полный лог.
Иногда выдаёт ошибку
ERROR: Can't get ouput of a running task. (кстати там опечатка)

В WebGUI видно что аутпут приходит прям в эвенте если открыто окно нужное. Требуется както подписаться на получение этих данных в мониторе?

Вопрос: как правильно запрашивать аутпут таскf в процессе рендера из монитора или просто из API?

Re: Получение output таска через API

Добавлено: Ср июн 13, 2018 2:08 pm
Timur
Делайте так же как WebGUI:

Код: Выделить всё

{"get":{"type":"jobs","ids":[19],"mode":"output","block_ids":[0],"task_ids":[77],"mon_id":6}}
Нельзя у сервера сразу спросить аутпут у выполняющего таска.
У сервера его попросту ещё нет.
А у рендера он напрямую спрашивать уже давно не может, с тех пор как клиенты в афанасии перестали слушать порт (и это правильно, ушло куча геморроя).
Теперь монитор может только подписаться на аутпут выполняющегося таска.
Сервер будет ждать ближайшего апдейта рендера, на котором его попросит прислать ему аутпут.
После, на ближайшем апдейте монитора, он перешлёт его монитору.

Re: Получение output таска через API

Добавлено: Ср июн 13, 2018 3:31 pm
paulwinex

Код: Выделить всё

{"get":{"type":"jobs","ids":[19],"mode":"output","block_ids":[0],"task_ids":[77],"mon_id":6}}
Я понял что это опрос изменений. А как подписаться на логи? Не смог найти в примерах в и консоли WebGUI.

Re: Получение output таска через API

Добавлено: Ср июн 13, 2018 3:58 pm
Timur
Вам нужен лог или аутпут? Это совсем разные вещи.
Лог - это лог действий сервера. Он пишет в лог прежде чем что-то сделать.
Аутпут - это stdout+stderr дочернего процесса (таска), его читает рендер, а по завершении таска, отправляет его на сервер.
И то и другое запрашивает afwatch и вебгуи, смотрите их логи.

Re: Получение output таска через API

Добавлено: Чт июн 14, 2018 1:02 pm
paulwinex
Мне нужен и аутпут и логи.
К сожалению не удалось определить как веб подписывается на аутпут и логи таска. Сидел втыкал в консоль, самое похожее что нашел это такой код

Код: Выделить всё

{"action":{"user_name":"coord","host_name":"pc","type":"monitors","ids":[3],"operation":{"type":"watch","class":"tasks","status":"subscribe","ids":[2]}}}
Но аутпут так и не заработал. Но тут и по команде ясно что не то что-то.

Подскажите пожалуйста как правильно монитор подписать на получение аутпута конкретной таски?

Re: Получение output таска через API

Добавлено: Пт июн 15, 2018 8:51 am
Timur

Код: Выделить всё

{"get":{"type":"jobs","ids":[19],"mode":"output","block_ids":[0],"task_ids":[77],"mon_id":6}}
Я не понимаю, я пишу, я делаю. Я просто копирую из network лога браузера.
Ну если браузер получает аутпут, значит это работает, значит так и надо получать аутпут, другого способа нет.

Re: Получение output таска через API

Добавлено: Пт июн 15, 2018 1:31 pm
paulwinex
Ну вот у меня как работает. Если я выполняю подобный код

Код: Выделить всё

{"get":{"type":"jobs","ids":[19],"mode":"output","block_ids":[0],"task_ids":[77],"mon_id":6}}
То в ответ получаю

Код: Выделить всё

Retrieving running task output from render...
А сам output прилетает в следующем эвенте tasks_progress, но один раз. То есть после получения этого аутпута нужно снова запрашивать первый код чтобы в следующий раз пришел новый (более полный) аутпут.
Так оно и работает? Я прсосто ожидал иного поведения, пытаюсь понять этапы. В данный момент у мня работает так как я описал выше (или очень на это похоже).

Re: Получение output таска через API

Добавлено: Пн июн 18, 2018 10:49 am
Timur
Да всё так и работает.
Нет такого понятия "подписаться на изменение аутпута".
Аутпут может только запроситься у рендера.
Если ещё такое понятие как Listen.
Вот там рендер шлёт аутпут серверу по мере его поступления, а сервер пересылает монитору.

Вообще есть 2а гуи - веб и воч. Они похожи и практически одинаковые по функционалу.
Ну кипер там ещё есть, там тоже микро-гуи можно назвать.
Под них всё и делалось.
Не было такого что был работающий сервер, без каких либо гуёв (и апи), потом решили написать некое универсальное API, а потом на этом API написали GUI.
- такой ситуации, как вы сами понимаете, вообще не могло произойти (она чисто теоретическая).
Поэтому смотрите афвоч и вебгуи. Если хотите писать что-то принципиально новое, то придётся и добавлять что-то новое и в АПИ.

Re: Получение output таска через API

Добавлено: Ср июн 20, 2018 5:54 am
paulwinex
Если хотите писать что-то принципиально новое, то придётся и добавлять что-то новое и в АПИ.
Я не против но в спп силёнок маловато. Я на питоне только и стараюсь делать максимально просто.
Один из критериев упрощения - если этого нету в оригинальном api то может оно и нафиг не надо?
Спасибо за подсказки.

Re: Получение output таска через API

Добавлено: Ср июн 20, 2018 1:40 pm
paulwinex
Сложно разбираться в функционировании без инструкций и только по косвенным признакам, но я вроде разобрался.
Долго думал что не так, почему постоянно только 'Retrieving running task output from render...'
Оказалось что после команды

Код: Выделить всё

{"get":{"type":"jobs","ids":[2],"mode":"output","block_ids":[0],"task_ids":[0],"mon_id":3}}
надо дождаться пока придёт ивент tasks_outputs, и только потом повторять запрос. А прийти оно может через несколько запросов обновлений.
До этого я каждый раз запрос делал и постоянно был в ожидании.
Вот так методом научного тыка всего за неделю решил простую задачу)

PS. В этом плане не хватает мануалов, наличие исходников не решает.