Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Новый топик    Ответить
 Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
Доброго времени суток.
Уважаемые коллеги , если знаете , то подскажите пожалуйста как реализовать следующею задачу:

Необходимо подключится к работающему процессу, выполнить команду, с инициированными объектами (внутри работающего процесса), и получить результат.


----------------------
Более подробно:
----------------------
Дано: Есть процесс Cache' запущенный в параллельном потоке через JOB. Нам известен номер ID запущенного процесса.
Необходимо:
1) Через вэб запрос подключится к этому процессу
2) Запустить команду,
3) Прочитать результат ранее выполненных команд (за промежуток между запросами)
4) Отключится от процесса и через определенное время повторить итерацию (реализовано на JS)
Реализация CSP класса:
Class User.main Extends %CSP.Page
{

/// Глобал в котором хронится информация о запущенном процессе
Parameter gl = "^mtempJobList";

ClassMethod OnPage() As %Status
{
    #dim %request as  %CSP.Request
    
    /// Получаем IP подключаемого клиента
    set i=$zu(111,0)
    set ip=$a(i,1)_"."_$a(i,2)_"."_$a(i,3)_"."_$a(i,4)
    
    /// Читаем команду из тела POST запроса
    s cmd=""
    if $isobject(%request.Content){
       for {
          quit:%request.Content.AtEnd
          set cmd=cmd_%request.Content.Read(32000)
       }
    }
    
    
    set initJob=0 // признак инициализации нового процесса
    
    // если процесс от клиента с IP адресом запущен, тогда работаем с ним (иначе инициализируем порвый JOB )
    if $data(@..#gl(ip)){
       set jobLoop=@..#gl(ip)
       if '$d(^$job(jobLoop)){ // Если процесса нет, тогда инициируем новый процесс
           kill ^SPOOL(jobLoop)
           kill @..#gl(ip)
          set initJob=1
       }
    }else{
	   set initJob=1   
    }
    
    

    
    if initJob=0 {    
        // получиь ID ранее запущеного процесса 
        set jobLoop=@..#gl(ip)
        // Запрос на закрытие процесса (Очистка процесса)
        if %request.Get("disconnect","")'=""{ 
           kill ^SPOOL(jobLoop)
           kill @..#gl(ip)
           do $zu(4,jobLoop) // принудительно закрываем процесс
           quit 1
        }
        
        // сообщение на выполнение
        if %request.Get("message","")'="",cmd'=""{ 
            
            // Вариант 1 : Записываем в глобал команду, а внутри процесса ожидаем появление команды. При появлении глобала, 
            // выполняем команду и очищаем глобал внутри работающего процесса
            // Все это работает, но присутствует ожидание в 1 секунду. это долго, хотелось бы  получить результат сразу.
            ; s @..#gl(ip,"message")=cmd
            
            // Вариант 2 : Запускаем команду сразу же в запросе, но при этом
            // нет подключения к работающему процессу,
            // а следовательно нет доступа к инициированным объектам(Такой вариант не подходит)  
              open 2:(jobLoop)
              use 2:(jobLoop)
              try{ x cmd }CATCH { } 
              close 2:(jobLoop)
              open 0
            
            // Вариант 3 : ???????????????????????????????????????????
            // ?????? Подключится к jobLoop и выполнить команду ??????
            // ???????????????????????????????????????????????????????   
              
        }
        
        // отправить ответ
        set ind=""
        for {
           set ind=$order(^SPOOL(jobLoop,ind))
           quit:ind=""
           continue:ind=2147483647
           write ^SPOOL(jobLoop,ind)
           kill ^SPOOL(jobLoop,ind)
        }
   }
    if initJob=1{
	   // запуск процесса 
       if cmd'=""{ /* авторизация */   }
       job ..loop(ip)
       write $zchild
       set @..#gl(ip)=$zchild
    }
    Quit $$$OK
}

/// Класс метод работает в паралельном потоке
/// Связь с потоком производится через глобал ^mtempJobList
ClassMethod loop(ip)
{
    kill ^SPOOL($job)
    open 2:($job)
    use 2:($job)
    for {
	    use 2:($job) // Переключаем вывод в ^SPOOL
        quit:'$data(@..#gl@(ip)) // Если глобал удалили , тогда закрываем процесс 
       
        // если есть сообщение для  запущеного процесса, тогда выполняем его
        set cmd=""
        if $data(@..#gl@(ip,"message")){
           set cmd=@..#gl@(ip,"message")
           kill @..#gl@(ip,"message")         ; удаляем сообщение на выполнение
           try{ x cmd }CATCH { /* err */ } ; Выполнить команду
        }
    
        h 1 // пауза в 1 секунду    
    }
    close 2:($job)
    kill @..#gl(ip)
}

}


Я уверен , что данная возможность существует. Это уверенность родилась после того, как увидел работу дебагера в Ателиере. Который выполняет ровным счетом тоже самое. Главный вопрос состоит в том, как это реализовать.
14 май 18, 19:03    [21409164]     Ответить | Цитировать Сообщить модератору
 Re: Подключится к действующему процессу (через вэб запрос), запустить команду, и отключится  [new]
Блок А.Н.
Member

Откуда: Новосибирск
Сообщений: 3758
Вы это в продуктовой разработке собираетесь использовать? Я бы, мягко говоря, не советовал.
15 май 18, 11:41    [21410234]     Ответить | Цитировать Сообщить модератору
 Re: Подключится к действующему процессу (через вэб запрос), запустить команду, и отключится  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
Блок А.Н.,
Добрый день .
Нет. Этот пример небудет использоваться в продакшен. О максимально упрощен, для понимания задачи.
Повторюсь: суть задачи состоит в том , что нужн механизм подключения к работающему процессу, в котором уже инициированы объекты.
15 май 18, 11:50    [21410265]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13059
MyasnikovIA
Необходимо подключится к работающему процессу, выполнить команду, с инициированными объектами (внутри работающего процесса), и получить результат.

Возможно все решить гораздо проще...

"Общайтесь" с процессом через некий глобал. Пусть тот процесс "посматривает" в него на предмет "не появились ли задания для меня". Если такие есть - пусть выполняет. Параметры можно брать там же...
О результатах пусть пишет в глобал. Их от туда можно будет прочитать.

И не старайтесь усложнять себе жизнь "технологиями".
16 май 18, 08:50    [21412339]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
krvsa,

Добрый день.
В приведенном мною примере есть такой фрагмент кода:

            // Вариант 1 : Записываем в глобал команду, а внутри процесса ожидаем появление команды. При появлении глобала, 
            // выполняем команду и очищаем глобал внутри работающего процесса
            // Все это работает, но присутствует ожидание в 1 секунду. это долго, хотелось бы  получить результат сразу.
            ; s @..#gl(ip,"message")=cmd

в нем как раз и реализован тот метод, который вы рекомендуете.
Недостаток этого метода состоит в том, что внутри запущенного параллельного процесса есть бесконечный цикл с задержкой в 1 секунду.
Вот как раз эту задержку хотелось бы убрать.
Если сделать без конечный цикл, без задержки (удалить "h 1" в класс методе "loop(ip)"), то он поглотит много ресурсов. Опять же не наш вариант.

Может, есть возможность создать механизм, который останавливает, ставит выполнение процесса на паузу, до момента появления глобала. Когда глобал появляется процесс снимается с паузы и продолжает работу. Это конечно фантазия, но кто его знает, может такой механизм уже существует.
16 май 18, 09:35    [21412414]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13059
MyasnikovIA
Недостаток этого метода состоит в том, что внутри запущенного параллельного процесса есть бесконечный цикл с задержкой в 1 секунду.
Вот как раз эту задержку хотелось бы убрать.

Это опять какая-то самоцель?

MyasnikovIA
Если сделать без конечный цикл, без задержки (удалить "h 1" в класс методе "loop(ip)"), то он поглотит много ресурсов. Опять же не наш вариант.

Дабы процесс не жрал ресурсы, ИС рекомендовали понижать ему приоритет. Для этого у нас есть вот такая функция...
	/// Установка приоритетов
setPrio(Prio,Batch)
	n prio,batch
	s:$g(Prio)="" Prio=0
	s:$g(Batch)="" Batch=1
	i $t(SET^%PRIO)="" q:$q 1 q
	s prio="NORMAL"
	s batch="BATCH"
	s:Prio=-1 prio="LOW"
	s:Prio=1 prio="HIGH"
	s:Batch=0 batch="NOBATCH"
	d SET^%PRIO(prio_","_batch)
	q:$q 1
	q


MyasnikovIA
Может, есть возможность создать механизм, который останавливает, ставит выполнение процесса на паузу, до момента появления глобала. Когда глобал появляется процесс снимается с паузы и продолжает работу. Это конечно фантазия, но кто его знает, может такой механизм уже существует.

Тогда зачем вообще этот процесс?
Зачем на сервере висеть чему-то "спящему" и ничего не делающему?

Эта проблема вообще решается на раз! На сервере просто ничего не запускается если это никому не нужно.
А вот если кому-то это понадобилось - запускается и работает. Отвечает на запросы.
Если всем ответили - работа заканчивается.
16 май 18, 10:32    [21412558]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 790
Задержку можно сделать намного меньше, например hang 0.05 (меньше 20 мсек не советую, не стабильно... и меньше 15мсек может превращаться в 0 мсек).
Находиться в "спячке" процесс может на команде Lock, но могут быть трудности с синхронизацией.
Лучше для "спячки"-"пробуждения" использовать механизм обмена сообщениями между процессами. Пробуждение практически мгновенно, да и саму команды, результаты передаются в теле сообщений - полная изоляция.
16 май 18, 11:37    [21412744]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
AlexKB,

Добрый день.
Ранее незнал, что в оператор "H" можно указывать вторым аргументом числа с запятой. Сейчас буду знать.

Я не совсем понял про механизм обмена между процессами. можите поведать по подробнее, или подсказать где посмотреть пример такого обмена .
За ранее спасибо.
16 май 18, 12:13    [21412906]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
AlexKB
Member

Откуда: Запорожье
Сообщений: 790
MyasnikovIA,

The %SYSTEM.Event class provides an interface to the Cache Event API. в документации.
Где то на сайте ИС есть пример использования.
Мои собственные примеры сейчас далеко... искать надо...
16 май 18, 12:20    [21412940]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
AlexKB,

Спасибо.
по ищу
16 май 18, 12:36    [21413010]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
krvsa
Member

Откуда: г Волжский
Сообщений: 13059
Вот целая тема про это %SYSTEM.Event...
http://www.sql.ru/forum/1002374/sinhronizaciya-processov-pri-rasparallelivanii-zadachi-sredstvami-cache-event-api?hl=system event
16 май 18, 14:28    [21413564]     Ответить | Цитировать Сообщить модератору
 Re: Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться  [new]
MyasnikovIA
Member

Откуда: Новосибирск
Сообщений: 65
krvsa,

Отлично, как раз то,что нужно.
Всем большое спасибо.
Вопрос можно считать закрытым
16 май 18, 16:58    [21414326]     Ответить | Цитировать Сообщить модератору
Все форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M Ответить