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

paulwinex
Сообщения: 83
Зарегистрирован: Пт июл 14, 2017 9:50 am

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

Сообщение 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?
Аватара пользователя
Timur
Site Admin
Сообщения: 178
Зарегистрирован: Вс июл 09, 2017 4:59 pm
Откуда: Королёв
Контактная информация:

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

Сообщение Timur »

Делайте так же как WebGUI:

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

{"get":{"type":"jobs","ids":[19],"mode":"output","block_ids":[0],"task_ids":[77],"mon_id":6}}
Нельзя у сервера сразу спросить аутпут у выполняющего таска.
У сервера его попросту ещё нет.
А у рендера он напрямую спрашивать уже давно не может, с тех пор как клиенты в афанасии перестали слушать порт (и это правильно, ушло куча геморроя).
Теперь монитор может только подписаться на аутпут выполняющегося таска.
Сервер будет ждать ближайшего апдейта рендера, на котором его попросит прислать ему аутпут.
После, на ближайшем апдейте монитора, он перешлёт его монитору.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
paulwinex
Сообщения: 83
Зарегистрирован: Пт июл 14, 2017 9:50 am

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

Сообщение paulwinex »

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

{"get":{"type":"jobs","ids":[19],"mode":"output","block_ids":[0],"task_ids":[77],"mon_id":6}}
Я понял что это опрос изменений. А как подписаться на логи? Не смог найти в примерах в и консоли WebGUI.
Аватара пользователя
Timur
Site Admin
Сообщения: 178
Зарегистрирован: Вс июл 09, 2017 4:59 pm
Откуда: Королёв
Контактная информация:

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

Сообщение Timur »

Вам нужен лог или аутпут? Это совсем разные вещи.
Лог - это лог действий сервера. Он пишет в лог прежде чем что-то сделать.
Аутпут - это stdout+stderr дочернего процесса (таска), его читает рендер, а по завершении таска, отправляет его на сервер.
И то и другое запрашивает afwatch и вебгуи, смотрите их логи.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
paulwinex
Сообщения: 83
Зарегистрирован: Пт июл 14, 2017 9:50 am

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

Сообщение paulwinex »

Мне нужен и аутпут и логи.
К сожалению не удалось определить как веб подписывается на аутпут и логи таска. Сидел втыкал в консоль, самое похожее что нашел это такой код

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

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

Подскажите пожалуйста как правильно монитор подписать на получение аутпута конкретной таски?
Аватара пользователя
Timur
Site Admin
Сообщения: 178
Зарегистрирован: Вс июл 09, 2017 4:59 pm
Откуда: Королёв
Контактная информация:

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

Сообщение Timur »

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

{"get":{"type":"jobs","ids":[19],"mode":"output","block_ids":[0],"task_ids":[77],"mon_id":6}}
Я не понимаю, я пишу, я делаю. Я просто копирую из network лога браузера.
Ну если браузер получает аутпут, значит это работает, значит так и надо получать аутпут, другого способа нет.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
paulwinex
Сообщения: 83
Зарегистрирован: Пт июл 14, 2017 9:50 am

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

Сообщение 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, но один раз. То есть после получения этого аутпута нужно снова запрашивать первый код чтобы в следующий раз пришел новый (более полный) аутпут.
Так оно и работает? Я прсосто ожидал иного поведения, пытаюсь понять этапы. В данный момент у мня работает так как я описал выше (или очень на это похоже).
Аватара пользователя
Timur
Site Admin
Сообщения: 178
Зарегистрирован: Вс июл 09, 2017 4:59 pm
Откуда: Королёв
Контактная информация:

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

Сообщение Timur »

Да всё так и работает.
Нет такого понятия "подписаться на изменение аутпута".
Аутпут может только запроситься у рендера.
Если ещё такое понятие как Listen.
Вот там рендер шлёт аутпут серверу по мере его поступления, а сервер пересылает монитору.

Вообще есть 2а гуи - веб и воч. Они похожи и практически одинаковые по функционалу.
Ну кипер там ещё есть, там тоже микро-гуи можно назвать.
Под них всё и делалось.
Не было такого что был работающий сервер, без каких либо гуёв (и апи), потом решили написать некое универсальное API, а потом на этом API написали GUI.
- такой ситуации, как вы сами понимаете, вообще не могло произойти (она чисто теоретическая).
Поэтому смотрите афвоч и вебгуи. Если хотите писать что-то принципиально новое, то придётся и добавлять что-то новое и в АПИ.
Тимур Хайрулин
CGRU 3.3.1 Ubuntu 22.04LTS, MS Windows 10 (clients only).
paulwinex
Сообщения: 83
Зарегистрирован: Пт июл 14, 2017 9:50 am

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

Сообщение paulwinex »

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

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

Сообщение 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. В этом плане не хватает мануалов, наличие исходников не решает.
Ответить