Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   ООП головного мозга (https://javascript.ru/forum/server/34095-oop-golovnogo-mozga.html)

Gozar 23.12.2012 17:05

Цитата:

Сообщение от x-yuri
а зачем процессам убивать друг друга?

Чтобы глюков не было.

Состояние приложения может быть уже другим, а процесс требует выполнить то, что выполнять уже нельзя.

К примеру: Пользователь открыл файловый менеджер, поставил на загрузку файл. Файл улетел на сервер, но пользователь успел закрыть окно. А процесс требует обновления списка файлов после загрузки. Вылазит баг.

x-yuri 23.12.2012 17:07

Давай перейдем от абстрактных проблем к реальным ситуациям. Можешь привести пример?

x-yuri 23.12.2012 17:17

Т.е. есть два процесса: файловый менеджер и его дочерний процесс - upload файла. Файловый менеджер умер собственной смертью, а upload файла остался. Вопросы: 1) кто кого убивает, чтобы не было глюков? 2) почему upload файла не может выяснить, жив ли родитель, перед тем как запрашивать обновление списка файлов?

Gozar 23.12.2012 17:21

Цитата:

Сообщение от x-yuri
1) кто кого убивает, чтобы не было глюков?

За этим должно следить ядро. Убить процесс должен файловый менеджер при клике на крестик.

Цитата:

Сообщение от x-yuri
2) почему upload файла не может выяснить, жив ли родитель, перед тем как запрашивать обновление списка файлов?

Потому что это настоящий геморрой, который проще сказать, чем просчитать все варианты.

Если приложение простое, то там ещё можно выяснять жив родитель или нет, а если сложное, то количество вариантов растет с огромной скоростью. Количество процессов может исчисляться уже десятками и проверять всех родителей или ещё чего там может быть становиться проблематично.

Gozar 23.12.2012 17:25

А дебаг превращается в сущий ад. С процессами чуть больше кода, но зато можно поставить console = true и понять где глюк.

x-yuri 23.12.2012 17:29

Цитата:

Сообщение от Gozar
За этим должно следить ядро. Убить процесс должен файловый менеджер при клике на крестик.

Не совсем понял, чтобы не было глюков, убивает ядро или файловый менеджер? Кроме того, я правильно понял, что даже если пользователь закрыл файловый менеджер, upload файла должен продолжаться?

Цитата:

Сообщение от Gozar
Потому что это настоящий геморрой, который проще сказать, чем просчитать все варианты.

А какие есть варианты? По-моему все просто, когда файловый менеджер запускает дочерний процесс, между ними создается однозначная связь. Вижу два варианта: 1) ядро хранит дерево процессов и любой процесс может получить доступ к своему предку, 2) родительский процесс при необходимости передает ссылку на себя дочернему процессу.

Gozar 23.12.2012 17:39

Цитата:

Сообщение от x-yuri
даже если пользователь закрыл файловый менеджер, upload файла должен продолжаться?

А это как-то можно отменить? Хотя это собственно говоря несущественно.

Цитата:

Сообщение от x-yuri
убивает ядро или файловый менеджер?

И ещё кто-нибудь ... только через ядро. Послав запрос на закрытие процесса или процессов.

Цитата:

Сообщение от x-yuri
когда файловый менеджер запускает дочерний процесс, между ними создается однозначная связь.

Это вообще не важно. Между ними в любом случае будет связь. Меня интересуют процессы, между которыми нет связи!

Цитата:

Сообщение от x-yuri
1) ядро хранит дерево процессов и любой процесс может получить доступ к своему предку, 2) родительский процесс при необходимости передает ссылку на себя дочернему процессу.

Ядро хранит процессы, по поводу дерева думал, но не уверен пока, что хочу напихать в стек, обоймы. Это не суть, так как протокол процессов позволяет расширять себя.

Gozar 23.12.2012 17:49

Ок. Давай другой пример.

У нас есть квадратик. В него мы грузим то список, то табы. Связи между ними никакой нет. Будет грузиться то, что выбрал пользователь. Однако если пользователь будет тыкать слишком усердно мышкой, то порядок следования может перепутаться в лучшем случае. И тут проверять родителей или есть или нет в квадратике чего нельзя. Процессы то асинхронные.

tenshi 23.12.2012 17:58

не, тут лучше такая модель: у каждого ресурса есть список принадлежащих ему ресурсов. при уничтожении родительского ресурса дочерние уничтожаются автоматически.

x-yuri 23.12.2012 18:04

В этом случае получается есть владелец квадратика. По команде от пользователя он запускает в квадратике один из двух других процессов. Если в квадратике уже запущен какой-то процесс, перед тем как запускать другой процесс владелец квадратика должен убить текущий процесс (сообщить ему, что следует сворачивать удочки). Правильно? Но зачем такая терминология? То же самое можно сформулировать в терминах объектов (ресурсов). Необходимо лишь добавить возможность регистрировать создание объектов через какого-то внешнего арбитра (ядро).

Цитата:

Сообщение от tenshi
не, тут лучше такая модель: у каждого ресурса есть список принадлежащих ему ресурсов. при уничтожении родительского ресурса дочерние уничтожаются автоматически.

не совсем подходит, например, upload файлов (не всегда дочерние процессы должны убиваться в случае смерти родителя)

tenshi 23.12.2012 18:13

почему же? очень даже подходит. сначала дочернему ресурсу посылается сообщение самоубиться, а потом по таймауту прибивать насильно.

Gozar 23.12.2012 18:15

Цитата:

Сообщение от x-yuri
В этом случае получается есть владелец квадратика. По команде от пользователя он запускает в квадратике один из двух других процессов. Если в квадратике уже запущен какой-то процесс, перед тем как запускать другой процесс владелец квадратика должен убить текущий процесс (сообщить ему, что следует сворачивать удочки). Правильно?

Да.

Цитата:

Сообщение от x-yuri
Но зачем такая терминология?

Потому что она наиболее верно отражает суть.

Цитата:

Сообщение от x-yuri
То же самое можно сформулировать в терминах объектов.

Кругом и так одни объекты.

Цитата:

Сообщение от x-yuri
Необходимо лишь добавить возможность регистрировать создание объектов через какого-то внешнего арбитра (ядро).

Поясни.

x-yuri 23.12.2012 18:16

и еще вопрос: получается, термин процесс был введен только с целью журналировать действия?

x-yuri 23.12.2012 18:22

Цитата:

Сообщение от tenshi
почему же? очень даже подходит. сначала дочернему ресурсу посылается сообщение самоубиться, а потом по таймауту прибивать насильно.

Потому что дочерние процессы могут продолжать выполняться после завершения родителя. Либо родитель должен дожидаться завершения дочернего процесса "в фоне", тогда подходит. Не знаю, какой вариант лучше.

Цитата:

Сообщение от Gozar
Поясни.

То что ты делаешь, как я понимаю. Процессы создаются/убиваются через ядро. Аналогично можно поступать с объектами/ресурсами.

tenshi 23.12.2012 18:28

если нужно чтобы дочерний процесс продолжал работу, то он должен быть перепривязан в другому родителю. например к "менеджеру загрузки файлов".

x-yuri 23.12.2012 18:33

Поэтому я и говорю, что автоматическое убивание - спорное решение. Могу сказать, что в unix/linux системах, никакое автоматическое убивание не происходит, а в случае смерти родителя, процесс переходит во владение процесса init (pid 1).

Gozar 23.12.2012 18:43

Цитата:

Сообщение от x-yuri
с целью журналировать действия?

Дерево может делать вот так:

function Tree(id) {
    core.process({name:'getPath', parent: 'сontent'});
    var proc = core.process({name:'tree', parent: 'tree'});
}


И да, родитель нужен и еще нужен ребенок или дети.

tenshi 23.12.2012 18:43

это получается потенциальный источник утечек. бездомные ресурсы надо прибивать а не пристраивать их куда-попало)

Gozar 23.12.2012 18:45

Цитата:

Сообщение от tenshi
бездомные ресурсы

должны прибиваться, но не обязательно по таймеру.

tenshi 23.12.2012 18:56

не, ну надо же дать им возможность совершить сэппуку по всем правилам ритуала)

x-yuri 23.12.2012 19:04

Цитата:

Сообщение от Gozar
Дерево может делать вот так:

Т.е. все же процессы могут сообщать ядру, кто их создал? Чтобы дети могли получить доступ к родителю?

Цитата:

Сообщение от Gozar
И да, родитель нужен и еще нужен ребенок или дети.

В смысле?

Цитата:

Сообщение от tenshi
это получается потенциальный источник утечек. бездомные ресурсы надо прибивать а не пристраивать их куда-попало)

Ладно, сойдемся на твоем варианте, пока не доказана необходимость моего.

Цитата:

Сообщение от Gozar
должны прибиваться, но не обязательно по таймеру.

В случае внештатной ситуации по таймеру, а как еще? Как выше tenshi описывал: 1) сообщить процессу, что надо умереть, 2) если не умер через N секунд - контрольный в голову. :) Правда не могу придумать пример внештатной ситуации...

Gozar 23.12.2012 19:04

Цитата:

Сообщение от x-yuri
получается, термин процесс был введен только с целью журналировать действия?

Журналирует скорее лог. А процессы это текущее состояние программы в данный промежуток времени. Можно включить журналирование и даже воссоздать состояние на момент закрытия программы, но это вроде не совсем то. Хотя ...

Gozar 23.12.2012 19:07

Цитата:

Сообщение от x-yuri
Т.е. все же процессы могут сообщать ядру, кто их создал? Чтобы дети могли получить доступ к родителю?

Да.

Цитата:

Сообщение от x-yuri
В смысле?

Ну ты же сам сказал, что у процесса может быть ребенок, так почему не дети?

x-yuri 23.12.2012 19:13

Цитата:

Сообщение от x-yuri
В случае внештатной ситуации по таймеру, а как еще? Как выше tenshi описывал: 1) сообщить процессу, что надо умереть, 2) если не умер через N секунд - контрольный в голову. Правда не могу придумать пример внештатной ситуации...

Хотя, сложно сказать. Я так понимаю, в реальности никто никого не убивает. Просто когда процесс оживает, он может выяснить, что дальше ничего делать не надо. Поэтому может и не надо таймер.

Цитата:

Сообщение от Gozar
Журналирует скорее лог. А процессы это текущее состояние программы в данный промежуток времени.

Кто журналирует понятно. Я просто пытаюсь вывести цели добавления управления процессами. Пока что вижу две: 1) журналирование действий, 2) создание связей между процессами (чтобы дети могли получить доступ к родителям).

tenshi 23.12.2012 19:19

Цитата:

Сообщение от Gozar (Сообщение 223103)
Журналирует скорее лог. А процессы это текущее состояние программы в данный промежуток времени. Можно включить журналирование и даже воссоздать состояние на момент закрытия программы, но это вроде не совсем то. Хотя ...

тут надо быть осторожным с восстановлением, а то будет как с браузерами, которые восстанавливают вкладки и тут же падают из-за одной из них)

tenshi 23.12.2012 19:27

Цитата:

Сообщение от x-yuri (Сообщение 223106)
Хотя, сложно сказать. Я так понимаю, в реальности никто никого не убивает. Просто когда процесс оживает, он может выяснить, что дальше ничего делать не надо. Поэтому может и не надо таймер.

а может и забыть и тогда поведение в общем случае непредсказуемое.

Gozar 23.12.2012 19:38

Цитата:

Сообщение от x-yuri
Пока что вижу две: 1) журналирование действий, 2) создание связей между процессами (чтобы дети могли получить доступ к родителям).

Журналирование это скорее следствие из реализации. Идея в связях между процессами.

x-yuri 23.12.2012 20:04

Цитата:

Сообщение от tenshi
а может и забыть и тогда поведение в общем случае непредсказуемое.

а как прекратить выполнение javascript функции извне?

Цитата:

Сообщение от Gozar
Журналирование это скорее следствие из реализации. Идея в связях между процессами.

Тогда в чем проблема? Передавай вызываемому коду ссылки на себя. Без всяких арбитров, и будут тебе связи.

tenshi 23.12.2012 20:15

например так) http://nodejs.org/api/process.html#p..._process_abort
также abort есть у XMLHttpRequest, для таймаутов - clearTimeout и тд..

Gozar 23.12.2012 20:36

Цитата:

Сообщение от x-yuri
Передавай вызываемому коду ссылки на себя.

На какого себя?

x-yuri 23.12.2012 20:39

Цитата:

Сообщение от Gozar
На какого себя?

this (self)

Gozar 23.12.2012 20:50

ничего не понял.

x-yuri 23.12.2012 21:15

function Parent() {
    new Child(this);
}
function Child(parent) {}
new Parent();

Gozar 23.12.2012 21:48

x-yuri,
Я может чего недопонимаю, но к чему это ты? Связи между родителями и детьми мне не нужны, я и так их знаю. В этом нет проблемы. Проблема в связях между модулями и непредсказуемостью поведения в зависимости от разных факторов: ответов сервера и действий пользователя.

x-yuri 23.12.2012 22:08

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

Gozar 23.12.2012 22:30

Цитата:

Сообщение от x-yuri
О модулях мы почти не говорили, но наверное ядро следит за зависимостями между модулями, подгружает их в случае необходимости.

Ничего оно не подгружает. Ядро следит только за процессами и всё. Мы можем запросить ядро - какие процессы сейчас работают и ядро ответит:
асинхронные:
1. такой-то
2. такой-то
...
синхронные(по сути он тоже асинхронный, но у нас блокирующий действия над изменением системы, то есть синхронный):
1. такой-то

За подгрузку модулей отвечает другой объект.

Да, можно расширить ядро и добавить таблицу вызовов(сопоставления или как там она называется). А что, идея. Спасибо за мысль.

x-yuri 23.12.2012 22:47

Ядро следит за процессами только для отладки/журналирования? Общаться между собой процессы могут и без ядра.

Цитата:

Сообщение от Gozar
Проблема в связях между модулями и непредсказуемостью поведения в зависимости от разных факторов: ответов сервера и действий пользователя.

Так между модулями или между процессами? Проблема подгрузки зависимостей (модулей) решается с помощью AMD-загрузчиков. Как поступать с непредсказуемостью поведения в зависимости от разных факторов мы вроде бы договорились.

Цитата:

Сообщение от Gozar
Да, можно расширить ядро и добавить таблицу вызовов(сопоставления или как там она называется).

что за таблица вызовов? Журнал вызовов ядра что ли?

Gozar 23.12.2012 22:54

Цитата:

Сообщение от x-yuri
что за таблица вызовов? Журнал вызовов ядра что ли?

['set', 'tree', 'del', ['path', 'title']]
...
При set tree убить path и title.

tenshi 23.12.2012 23:37

что-то я пропустил.. ты пишешь веб ос? чем оно будет отличаться от существующих?

Gozar 23.12.2012 23:59

Цитата:

Сообщение от tenshi
ты пишешь веб ос? чем оно будет отличаться от существующих?

Я не пишу веб ос. Я пишу кмс, а какая разница, пусть будет веб ос, можно и так назвать. Если вид поменять то будет и веб ос. Ну она удобная, не мои слова, хотя я тоже так считаю. Собственно я не пишу её для кого-то. Я написал её для себя, существующие не устраивали, просто нужно допилить.


Часовой пояс GMT +3, время: 05:42.