Объединить два канала закрытия - PullRequest
0 голосов
/ 17 января 2019

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

func MergeChans(c1 chan struct{}, c2 chan struct{}) chan struct{} {
    c3 := make(chan struct{})
    go func() {
        select {
        case <-c1: close(c3)
        case <-c2: close(c3)
        }
    }()
    return c3
}

Возможно ли достичь этого без подпрограммы?

1 Ответ

0 голосов
/ 17 января 2019

Если вы хотите вернуть «объединенный» канал до его закрытия, нет.

Но это не проблема, запускаемая вами процедура будет использовать 0 ресурсов ЦП. Вам не стоит об этом беспокоиться.

Как только один из каналов будет закрыт, функция завершится, и, таким образом, программа завершится правильно. Вам нужно только убедиться, что хотя бы один из каналов закрыт. Если вы не можете гарантировать это, программа никогда не прекратит работу и никогда не будет собирать мусор. Если вы не контролируете каналы, вы можете пропустить третий канал (или значение context.Context), чтобы обеспечить способ правильного завершения, например ::10000

func MergeChans(c1, c2, shutdown chan struct{}) chan struct{} {
    c3 := make(chan struct{})
    go func() {
        select {
        case <-c1:
            close(c3)
        case <-c2:
            close(c3)
        case <-shutdown:
        }
    }()
    return c3
}

Если вы хотите избежать дополнительных процедур, не объединяйте их (добавьте 2 case s, где они должны контролироваться).

...