Доброго времени суток!

Необходимо запустить N подпроцессов из основного процесса и каким-то образом ожидать выполнения всех подпроцессов.

Буду благодарен любым идеям.

UPD-1. Изначально не известно сколько будет подпроцессов, поэтому такого рода схема не подойдет

Нравится

12 комментариев

Здравствуйте!

что то вроде такого -http://prntscr.com/ocm1ol

Вот наглядный пример, создал 3 БП, в них добавил разные таймеры и посмотрим как идет обработка в главном БП

http://prntscr.com/ocmaqq - Главный

http://prntscr.com/ocmaxg - 1 мин задержки

http://prntscr.com/ocmb6t - 2 мин задержки

http://prntscr.com/ocmbg8 - 3 мин задержки



Запускаем основной и смотрим диаграму:

http://prntscr.com/ocmc05

http://prntscr.com/ocmc9u

http://prntscr.com/ocmck4 - завершился (диаграма выполнения основного без изменения - http://prntscr.com/ocmcso)

http://prntscr.com/ocmda0

Нигрескул Алексей,

Обновил описание вопроса

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

Зверев Александр,

А где создавать это поле? И как сделать обработчик сигнала?

В каком-то объекте, подходящем по логике, с которым по смыслу связаны эти процессы. Обработчик — сигнал на изменение поля в объекте.

Зверев Александр,

То есть нужно в дочернем процессе сначала считать эту колонку селектом затем сделать update? НО если эти дочерние процессы завершаться секунда в секунду, то подсчет не будет верным. Как быть тогда?

Уменьшать и считывать старое значение можно в том же запросе.

Зверев Александр,

Гарантируется ли при использовании этого запроса правильный подсчет одновременно завершающихся подпроцессов?

Этот способ не является стандартным. Как такое делать штатно, описал выше для фиксированного числа процессов Алексей. Тут же все гарантии будет давать разработчик, то есть Вы. По идее, если всё в одном SQL-запросе, то мешать не будет.

Зверев Александр,

Зверев Александр пишет:Уменьшать и считывать старое значение можно в том же запросе.

Через такой запрос не генерится сигнал 

Действительно, в таком случае используйте не Update, а ESQ. Синхронизацию в этом случае нужно предусмотреть самостоятельно. Либо же менять при помощи Update, а в следующем шаге менять другое поле по ESQ или посылать сигнал иным образом.

Показать все комментарии