Закрывает ли блок канала, пока получатель не прочитает его - PullRequest
0 голосов
/ 03 сентября 2018

Я реализовал метод отключения моего сервера путем закрытия канала, поэтому другие программы читают закрытый канал и затем выходят. После выключения мне нужно выполнить некоторую очистку с данными сервера, если close() блокируется, пока все другие программы не прочитают закрытый канал, я могу получить доступ к данным без блокировки. Таким образом, вопрос: закрывает ли блок канала, пока получатель не прочитает с него? Ниже приведен пример кода:

package main

type server struct {
    chStop chan struct{}
    data map[int]interface{}
}

func newServer() *server {
    return &server {
        chStop: make(chan struct{})
    }
}

func (s *server) stop() {
    close(s.chStop)
    // do something with s.data
    ...
    // if other goroutines already read closed s.chStop and exited,
    // we can access s.data without lock
}

func (s *server) run2() {
    ...
    for {
        select{
        case <-s.chStop:
            return
        case <- other channel:
        // access s.data with lock
        }
    }
}

func (s *server) run() {
    ch := make(chan struct{})
    ...
    for {
        select{
        case <-s.chStop:
            return
        case <- ch:
            // access s.data with lock
        }
    }
}

func main() {
    s := newServer()
    go s.run()
    go s.run2()
    s.stop()
}

1 Ответ

0 голосов
/ 03 сентября 2018

Нет. Вместо этого используйте sync.WaitGroup.

...