Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться / 12 сообщений из 12, страница 1 из 1
14.05.2018, 19:03
    #39644614
MyasnikovIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
Доброго времени суток.
Уважаемые коллеги , если знаете , то подскажите пожалуйста как реализовать следующею задачу:

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


----------------------
Более подробно:
----------------------
Дано: Есть процесс Cache' запущенный в параллельном потоке через JOB. Нам известен номер ID запущенного процесса.
Необходимо:
1) Через вэб запрос подключится к этому процессу
2) Запустить команду,
3) Прочитать результат ранее выполненных команд (за промежуток между запросами)
4) Отключится от процесса и через определенное время повторить итерацию (реализовано на JS)
Реализация CSP класса:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
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)
}

}



Я уверен , что данная возможность существует. Это уверенность родилась после того, как увидел работу дебагера в Ателиере. Который выполняет ровным счетом тоже самое. Главный вопрос состоит в том, как это реализовать.
...
Рейтинг: 0 / 0
15.05.2018, 11:41
    #39644857
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
Вы это в продуктовой разработке собираетесь использовать? Я бы, мягко говоря, не советовал.
...
Рейтинг: 0 / 0
15.05.2018, 11:50
    #39644867
MyasnikovIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
Блок А.Н.,
Добрый день .
Нет. Этот пример небудет использоваться в продакшен. О максимально упрощен, для понимания задачи.
Повторюсь: суть задачи состоит в том , что нужн механизм подключения к работающему процессу, в котором уже инициированы объекты.
...
Рейтинг: 0 / 0
16.05.2018, 08:50
    #39645297
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
MyasnikovIAНеобходимо подключится к работающему процессу, выполнить команду, с инициированными объектами (внутри работающего процесса), и получить результат.
Возможно все решить гораздо проще...

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

И не старайтесь усложнять себе жизнь "технологиями".
...
Рейтинг: 0 / 0
16.05.2018, 09:35
    #39645316
MyasnikovIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
krvsa,

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

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


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

Может, есть возможность создать механизм, который останавливает, ставит выполнение процесса на паузу, до момента появления глобала. Когда глобал появляется процесс снимается с паузы и продолжает работу. Это конечно фантазия, но кто его знает, может такой механизм уже существует.
...
Рейтинг: 0 / 0
16.05.2018, 10:32
    #39645340
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
MyasnikovIAНедостаток этого метода состоит в том, что внутри запущенного параллельного процесса есть бесконечный цикл с задержкой в 1 секунду.
Вот как раз эту задержку хотелось бы убрать.
Это опять какая-то самоцель?

MyasnikovIAЕсли сделать без конечный цикл, без задержки (удалить "h 1" в класс методе "loop(ip)"), то он поглотит много ресурсов. Опять же не наш вариант.
Дабы процесс не жрал ресурсы, ИС рекомендовали понижать ему приоритет. Для этого у нас есть вот такая функция...
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	/// Установка приоритетов
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Может, есть возможность создать механизм, который останавливает, ставит выполнение процесса на паузу, до момента появления глобала. Когда глобал появляется процесс снимается с паузы и продолжает работу. Это конечно фантазия, но кто его знает, может такой механизм уже существует.
Тогда зачем вообще этот процесс?
Зачем на сервере висеть чему-то "спящему" и ничего не делающему?

Эта проблема вообще решается на раз! На сервере просто ничего не запускается если это никому не нужно.
А вот если кому-то это понадобилось - запускается и работает. Отвечает на запросы.
Если всем ответили - работа заканчивается.
...
Рейтинг: 0 / 0
16.05.2018, 11:37
    #39645366
AlexKB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
Задержку можно сделать намного меньше, например hang 0.05 (меньше 20 мсек не советую, не стабильно... и меньше 15мсек может превращаться в 0 мсек).
Находиться в "спячке" процесс может на команде Lock, но могут быть трудности с синхронизацией.
Лучше для "спячки"-"пробуждения" использовать механизм обмена сообщениями между процессами. Пробуждение практически мгновенно, да и саму команды, результаты передаются в теле сообщений - полная изоляция.
...
Рейтинг: 0 / 0
16.05.2018, 12:13
    #39645410
MyasnikovIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
AlexKB,

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

Я не совсем понял про механизм обмена между процессами. можите поведать по подробнее, или подсказать где посмотреть пример такого обмена .
За ранее спасибо.
...
Рейтинг: 0 / 0
16.05.2018, 12:20
    #39645418
AlexKB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
MyasnikovIA,

The %SYSTEM.Event class provides an interface to the Cache Event API. в документации.
Где то на сайте ИС есть пример использования.
Мои собственные примеры сейчас далеко... искать надо...
...
Рейтинг: 0 / 0
16.05.2018, 12:36
    #39645431
MyasnikovIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
AlexKB,

Спасибо.
по ищу
...
Рейтинг: 0 / 0
16.05.2018, 14:28
    #39645529
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
...
Рейтинг: 0 / 0
16.05.2018, 16:58
    #39645670
MyasnikovIA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
krvsa,

Отлично, как раз то,что нужно.
Всем большое спасибо.
Вопрос можно считать закрытым
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]