powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
12 сообщений из 12, страница 1 из 1
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
    #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
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
    #39644857
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы это в продуктовой разработке собираетесь использовать? Я бы, мягко говоря, не советовал.
...
Рейтинг: 0 / 0
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
    #39644867
MyasnikovIA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.,
Добрый день .
Нет. Этот пример небудет использоваться в продакшен. О максимально упрощен, для понимания задачи.
Повторюсь: суть задачи состоит в том , что нужн механизм подключения к работающему процессу, в котором уже инициированы объекты.
...
Рейтинг: 0 / 0
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
    #39645297
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MyasnikovIAНеобходимо подключится к работающему процессу, выполнить команду, с инициированными объектами (внутри работающего процесса), и получить результат.
Возможно все решить гораздо проще...

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

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

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

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


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

Может, есть возможность создать механизм, который останавливает, ставит выполнение процесса на паузу, до момента появления глобала. Когда глобал появляется процесс снимается с паузы и продолжает работу. Это конечно фантазия, но кто его знает, может такой механизм уже существует.
...
Рейтинг: 0 / 0
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
    #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
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
    #39645366
AlexKB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задержку можно сделать намного меньше, например hang 0.05 (меньше 20 мсек не советую, не стабильно... и меньше 15мсек может превращаться в 0 мсек).
Находиться в "спячке" процесс может на команде Lock, но могут быть трудности с синхронизацией.
Лучше для "спячки"-"пробуждения" использовать механизм обмена сообщениями между процессами. Пробуждение практически мгновенно, да и саму команды, результаты передаются в теле сообщений - полная изоляция.
...
Рейтинг: 0 / 0
Подключиться к действующему процессу (через веб запрос), запустить команду, и отключиться
    #39645410
MyasnikovIA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlexKB,

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

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

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

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

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


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