Как синхронизировать асинхронно или многопоточно, распространение сигнала в графе?

Название вопроса не придумал. Короче.
Как реализовать такое. Многопоточно или лучше асинхронно.
Не прошу писать решения, хочу найти похожий пример или общие советы, перерыл много простых примеров, и не нашел, или не заметил. Нужен короче "правильный" паттерн. Или структура.
Задача.
1. По трубам течет вода, и распространяется по всем вентилям, клапанам, тройнийникам и тд. (Короче не сантехник).
2. Нужно, сделать так что бы вода от вентиля(то есть раздвоения, разветвления), до другого шла равномерно(к примеру визуализировать).
3. Трубы, как графы, но с Открытыми или закрытыми вентилями. (На вентили по функции активации, зависит откроется ли там 0-N клапанов.
4. Тут некая сложность(Для многопоточного и того варианта что хочу узнать, ниже). Нет гарантии что слой знает, что пришла последняя порция, то есть может встать в вечное ожидание.
5. Весь процесс Конвейерный. ТО есть источник(краник) не ждем пока порция воды добежит до конца, а запускается по частоте. На линии длинной в N слоев может быть 0 - N порций.
Условия.
  1. Условие. Вода течет только вперед +-89 градусов!!!
  2. Все клапаны распределены по слоям, каждый слой на Одной Высоте
  3. Только после того как вода(или будем считать цилиндрик потока), пришел на самый последний клапан N слоя,
    все клапаны на N слое(для которых функция активации сработала), Открываются и кубик воды течет на N+1 слой


Теперь главное.Т
  1. Источников потока(кранов) несколько., тут уже нужна синхронизация, примеру 1-ый имеет частоту 1 открытие в 2 секунды, 2-ой раз в 3 секунды, а 3-ий вообще по Щелчку мышки по кнопке.
  2. Опять же надо что бы синхронная логика выполнялась. Вода должна течь равномерно(если визуализировать).
  3. До этого граф был более похож на дерево, в пред. пункте добавили несколько новых корней к дереву. Но теперь добавляем условие, что могут быть Источники могут быть между любым слоем
  4. Если допустим с другого источника пришел поток в момент выполняя функций активации на клапанах на N слое, то он обработается на следующей итерации(Весь процесс Конвеерный)

Так же условие. Нужен подходящей Паттерн.
К примеру есть сущности,
1. Клапаны.
2. Трубы.
3. Источники.
4. Диспетчер, который только получал сигналы, от труб, что кубик воды пришел из элемента на Слое N, и потом обрабатывал их всех.
Трубы должны сообщать диспетчеру, что готовы встать в очередь на слой. (то есть передают Функцию, которая связывает 2 клапана источник-приемник), когда ф-ия выполняется, приемник получит Value и дальше, если там условие активации сработает, то передаст ( OnChangProperty) следующим по цепи приемникам.
В Идеале, или то как я хочу. Диспетчер НЕ ДОЛЖЕН ЗНАТЬ ГРАФ
Так же там связи.
1 Источник - Множество приемников. Только
На картинке там 2 источника в один приемник. Но будем считать что у Приемника 2 разных канала входа. Которые 1 выход имеют.
Проект библиотека, который поставляет эти сущности.
Фронтенд же должен быть
RootSource.Connect(Elem1);
 Elem1.Connect(elem2);  
Elem1.Connect(elem3);
elem1.Connect(elem3); //....
//  то есть нужно как-то внутрь запихать  логику диспетчера,  который не будет видеть полной схемы.

63063e7374714362774384.png
  • Вопрос задан
  • 228 просмотров
Пригласить эксперта
Ответы на вопрос 1
AleksejMsk
@AleksejMsk
Программирую от души за деньги
Используя TPL можно построить граф из Задач и запускать вычисления - как поток от задачи к задаче.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы