как получить кол-во ожидающих данных в канале?
а для какой цели? мне просто интересно зачем это вообще может понадобиться
Менеджер обрабатывает пулл сообщений, но пока что они хранятся в памяти. Стало интересно, как мне понять, прошла ли рассылка до конца или нет, прежде чем я очередной раз ребутну прогу)
А не проще просто закрыть канал в этом случае? Быстрое, но не очень хорошее решение: Закрываешь канал на отправителе, на приёмнике из for range получается выход после обработки всех сообщений. Значит можно отправить сигнал что все джобы окончены, или же просто упасть по таймеру. Если делать лучше: ВО - внутренний объект/сущность, который работу работает (ну или является обёрткой типа usecase, не важно). -Массив каналов для передачи всем ВО команды graceful shutdown. В каждом ВО свой канал для выключения. -Массив каналов для получения информации о завершении работы каждого ВО. -Канал с сигналом что проге пора безусловно завершаться. -Везде где можно стараться делать таймеры на отключения по таймауту, а не только в "родителе" который управляет сигналами. -При получении сигнала завершения - пробежать по массиву каналов отключения ВО и послать им сигналы собственно отключения. -Во всех ВО сначале идёт select, чтобы понять надо новую джобу брать, или выключаться. -Если пора выключаться, а в очереди ждёт пачка джобов - пробежаться по ним и зафиксировать (залогировать?) что они отменены (а не выполнять). Далее отправить сигнал о завершении ВО. Ну или просто забить как в простом примере выше, но так делать не очень хорошо. -В случае когда не из всех каналов получен результат что ВО перестал работать - сработает основной таймер, который и отправит сигнал безусловного завершения. Надо фисировать все ВО что не завершились успешно, чтобы потом понимать куда начать копать в дебаге. -Если все команды отключения ВО завершились, то само собой что сигнал завершения раньше отправится.
Хехе, не уверен что я на столько готов помучаться ради этого, но поразмышлять определенно стоит...
Для такого можно закрыть канал, после чего подождать sync.WaitGroup.Wait — по сути эта штука как раз для такого и предназначена
Так я в целом и не хотел канал закрывать) Просто хотел узнать, сколько там работы. Просто если там тысяча+ тасков, нет смысла останавливать, так как там параллельно постоянные задачи работают, и отрубать всё пользователям пока не дообработаются эти, нельзя)
Мне WaitGroup не нравится в этом случае, т.к. прога может висеть неопределённо долго. Зависит от задачи: надо безусловно завершить рассылку, или можно забить
Да я думаю что буду просто все задачи в бд записывать, и при поднятии сервиса снова запихивать в канал
Обсуждают сегодня