OberonCore
https://forum.oberoncore.ru/

О модели параллелизма
https://forum.oberoncore.ru/viewtopic.php?f=31&t=2301
Страница 1 из 2

Автор:  Иван Кузьмицкий [ Понедельник, 01 Февраль, 2010 11:58 ]
Заголовок сообщения:  О модели параллелизма

ОТДЕЛЕНО ОТСЮДА: viewtopic.php?p=41463#p41463

Илья Ермаков писал(а):
... мы у себя в "Метасистемах" приняли решение, что внутри одного объектного пространства, т.е. одного экземпляра ядра ББ, нескольких потоков у нас не будет никогда.


Как тогда добиться того, чтобы хотя бы прогресс-бар и весь ББ не "зависал" на долгих процессах? Вот, например, у меня в таблицу ODT выгружается список учреждений около 2 минут, и всё это время ББ полностью "погружён в себя", что нехорошо по отношению к пользователю :) Даже Services.Action не помогает...

Автор:  Сергей Губанов [ Понедельник, 01 Февраль, 2010 13:17 ]
Заголовок сообщения:  Re: Стиль "Скульптор" и "Снова о методах"

Илья Ермаков писал(а):
На возражения "а многопоточность...", напоминаю, что мы у себя в "Метасистемах" приняли решение, что внутри одного объектного пространства, т.е. одного экземпляра ядра ББ, нескольких потоков у нас не будет никогда. Ввиду чего сразу перестали забивать себе мозги по каждому поводу "а что, если вот эта служба будет использоваться несколькими потоками...".

И получили возможность использовать ряд простых схем.

Можно это вынести в отдельную ветку и как следует обсудить.

Нахожу ваше решение излише строгим. Его можно смягчить.

Я вот в дотнете тоже к хозяйствованию в одном (логическом) объектном пространстве допускаю только один поток, но это не означает, что в одном экземпляре рантайма у меня существует всего одно (логическое) объектное пространство. У меня их несколько непересекающихся. Они взаимодействуют друг с другом с помощью очередей сообщений.

На тот случай, чтобы кто-то случайно не вызвал какую-то процедуру не в том потоке в каком надо у меня там стоят рантайм-проверки. Например, если какие-то процедуры должны исполняться только потоком класса BasicService, то в начале каждой из них стоит вызов очень маленькой процедурки (тактов на десять) BasicService.ThreadSafeInsurance()
Код:
/// <summary>
/// Осуществляет проверку того, что текущий поток является главным потоком сервиса.
/// Если текущий поток оказался другой, то возбуждается System.Exception.
/// </summary>
public static void ThreadSafeInsurance ()
{
   int id = System.Threading.Thread.CurrentThread.ManagedThreadId;
   if (id != service_managed_thread_id)
   {
      throw new System.Exception("You must call this code only in main service thread context. Service thread id = "
         + service_managed_thread_id + ", current thread id = " + id + ".");
   }
}

В будущем планирую изобрести способ разбить большое "объектное пространство" на "дерево объектных пространств". В корне "дерева" будет работать один поток раскидывая сообщения по ветвям. Непересекающиеся "ветви объектного дерева" будут обслуживать несколько других потоков. Ветвей может быть очень много, потоков - сколько процессорных ядер + эпсилон.

Автор:  Сергей Губанов [ Понедельник, 01 Февраль, 2010 13:19 ]
Заголовок сообщения:  Re: Стиль "Скульптор" и "Снова о методах"

Иван Кузьмицкий писал(а):
Как тогда добиться того, чтобы хотя бы прогресс-бар и весь ББ не "зависал" на долгих процессах?
Разбивать большие задачи на маленькие и выполнять их по частям в Services.Action.

Автор:  Илья Ермаков [ Понедельник, 01 Февраль, 2010 16:23 ]
Заголовок сообщения:  Re: Стиль "Скульптор" и "Снова о методах"

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

Автор:  Илья Ермаков [ Понедельник, 01 Февраль, 2010 16:28 ]
Заголовок сообщения:  Re: Стиль "Скульптор" и "Снова о методах"

Сергей Губанов писал(а):
Я вот в дотнете тоже к хозяйствованию в одном (логическом) объектном пространстве допускаю только один поток, но это не означает, что в одном экземпляре рантайма у меня существует всего одно (логическое) объектное пространство. У меня их несколько непересекающихся. Они взаимодействуют друг с другом с помощью очередей сообщений.


Я тоже это и предлагаю. В одном адресном пространстве (одном приложении) несколько объектных. Только при лёгкости ядра ББ есть резон дать каждому пространству по Kernel-у и по собственному пространству модулей - и не париться.

Автор:  Сергей Губанов [ Понедельник, 01 Февраль, 2010 18:55 ]
Заголовок сообщения:  Re: О модели параллелизма

> дать каждому пространству по Kernel-у

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

Автор:  Илья Ермаков [ Понедельник, 01 Февраль, 2010 23:31 ]
Заголовок сообщения:  Re: О модели параллелизма

Например, обмениваться через нетипизированную память (File-in-memory) и т.п.

Автор:  Сергей Губанов [ Понедельник, 01 Февраль, 2010 23:54 ]
Заголовок сообщения:  Re: О модели параллелизма

> обмениваться через нетипизированную память (File-in-memory)

То есть сериализовывать, а потом десериализовывать...
Это неприемлемо в случае когда нужно передавать сложные структуры данных с указателями.

У меня один поток получает сообщения по TCP, десериализует их, ставит в очередь на обработку. Другой поток забирает их из этой очереди, обрабатывает, формирует ответные сообщения, ставит их в очередь на отправку. Третий поток берёт сообщения из очереди отправляемых, сериализует их и отправляет по TCP.

Автор:  Axcel [ Вторник, 02 Февраль, 2010 08:11 ]
Заголовок сообщения:  Re: Стиль "Скульптор" и "Снова о методах"

Сергей Губанов писал(а):
...Нахожу ваше решение излише строгим. Его можно смягчить.

Я вот в дотнете тоже к хозяйствованию в одном (логическом) объектном пространстве допускаю только один поток, но это не означает, что в одном экземпляре рантайма у меня существует всего одно (логическое) объектное пространство. У меня их несколько непересекающихся. Они взаимодействуют друг с другом с помощью очередей сообщений.

На тот случай, чтобы кто-то случайно не вызвал какую-то процедуру не в том потоке в каком надо у меня там стоят рантайм-проверки. Например, если какие-то процедуры должны исполняться только потоком класса BasicService, то в начале каждой из них стоит вызов очень маленькой процедурки (тактов на десять) BasicService.ThreadSafeInsurance()
...

Да, вот это мне понятно.
По поводу проверки: мне кажется была бы полезна, некая централизованная служба регистрации (процедуры в потоке), и проверка не в самой процедуре, а более общими средствами (т.е. не процедуры, а активного объекта)

Автор:  Geniepro [ Среда, 03 Февраль, 2010 09:17 ]
Заголовок сообщения:  Re: О модели параллелизма

Сергей Губанов писал(а):
У меня один поток получает сообщения по TCP, десериализует их, ставит в очередь на обработку. Другой поток забирает их из этой очереди, обрабатывает, формирует ответные сообщения, ставит их в очередь на отправку. Третий поток берёт сообщения из очереди отправляемых, сериализует их и отправляет по TCP.

Если не секрет, какой библиотекой для обмена сообщениями пользуетесь? Чьей-то чужой или самодельной?
Не могли бы Вы что-то сказать по поводу MPAPI, MPI.NET и .NET Remoting/WCF.
Просто я сейчас тоже занимаюсь похожей задачей -- распределённым приложением под .NET и C# и при этом немного вообще-то плаваю в этой теме... :(

Автор:  Сергей Губанов [ Среда, 03 Февраль, 2010 13:24 ]
Заголовок сообщения:  Re: О модели параллелизма

> какой библиотекой для обмена сообщениями пользуетесь?

Ыыы??? Никакой.

Автор:  Geniepro [ Среда, 03 Февраль, 2010 16:13 ]
Заголовок сообщения:  Re: О модели параллелизма

Сергей Губанов писал(а):
> какой библиотекой для обмена сообщениями пользуетесь?

Ыыы??? Никакой.

То есть просто Mono-обёртками над BSD-сокетами? Но это же низкоуровнево и ненадёжно?

ЗЫ. Между потоками у вас тоже сообщения через сокеты летают?

Автор:  Сергей Губанов [ Среда, 03 Февраль, 2010 23:43 ]
Заголовок сообщения:  Re: О модели параллелизма

> То есть просто Mono-обёртками над BSD-сокетами?

Берёшь System.Net.Sockets.Socket и вперёд.

> Но это же низкоуровнево и ненадёжно?

Как страшно жить...

> Между потоками у вас тоже сообщения через сокеты летают?

Между потоками летают по указателям.

Автор:  Geniepro [ Пятница, 05 Февраль, 2010 07:47 ]
Заголовок сообщения:  Re: О модели параллелизма

Всё ясно.

Сергей Губанов писал(а):
Как страшно жить...

Да просто больше не хочется колоться, плакать, но продолжать есть кактус...

Автор:  Илья Ермаков [ Пятница, 05 Февраль, 2010 10:08 ]
Заголовок сообщения:  Re: О модели параллелизма

Согласен, затрепали эти сокеты :)

Именно поэтому зреет желание (авантюрное и пока не до него, но...) послать их в ... вместе с TCP-уровнем, работать пониже на стеке протоколов.

Все эти вечные "умные" механизмы, которым не место быть впаянными на таком уровне.

Автор:  Trurl [ Пятница, 05 Февраль, 2010 14:07 ]
Заголовок сообщения:  Re: О модели параллелизма

Иван Кузьмицкий писал(а):
Вот, например, у меня в таблицу ODT выгружается список учреждений около 2 минут, и всё это время ББ полностью "погружён в себя", что нехорошо по отношению к пользователю :)


"В заботе о ближнем главное - не перестараться". ;) Многие вполне респектабельные программы ведут себя точно так же и это никого не волнует.

Автор:  Иван Денисов [ Вторник, 09 Март, 2010 13:41 ]
Заголовок сообщения:  Re: О модели параллелизма

Сергей Губанов писал(а):
> То есть просто Mono-обёртками над BSD-сокетами?

Берёшь System.Net.Sockets.Socket и вперёд.

> Но это же низкоуровнево и ненадёжно?

Как страшно жить...

> Между потоками у вас тоже сообщения через сокеты летают?

Между потоками летают по указателям.

Расскажите про это немного подробнее, пожалуйста? Правильно ли понял, что вместо передачи всего объекта, можно передать по TCP другому BB указатель на объект и он "поймет его", если находится на той же машине?

Автор:  Иван Кузьмицкий [ Вторник, 09 Март, 2010 13:49 ]
Заголовок сообщения:  Re: О модели параллелизма

Trurl писал(а):
Иван Кузьмицкий писал(а):
Вот, например, у меня в таблицу ODT выгружается список учреждений около 2 минут, и всё это время ББ полностью "погружён в себя", что нехорошо по отношению к пользователю :)


"В заботе о ближнем главное - не перестараться". ;) Многие вполне респектабельные программы ведут себя точно так же и это никого не волнует.


Этот дурной тон чреват ошибками пользователя :) Реальная ситуация - человек считал, что ББ завис и просто через диспетчер задач убивал его.

Автор:  Евгений Темиргалеев [ Вторник, 09 Март, 2010 15:41 ]
Заголовок сообщения:  Re: О модели параллелизма

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

Автор:  Иван Денисов [ Вторник, 09 Март, 2010 16:24 ]
Заголовок сообщения:  Re: О модели параллелизма

А сделать свой прогресс бар вроде не сложно должно быть, а чтобы окна не зависали и он обновлялся воспользоваться поправкой Александра Ильина.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/