метод который запускает две goroutine, по окончании которых я хочу удалить объект из массива подобных объектов.
Но каждый метод является бесконечным циклом...
func (client *Client) Listen() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
client.listenWrite()
}()
go func() {
defer wg.Done()
client.listenRead()
}()
wg.Wait()
fmt.Printf("Listen у клиента %d работу закончил", client.id)
AppServer.DelClient(client)
}
func (client *Client) listenWrite() {
for {
select {
case <-client.doneCh:
fmt.Println("BBBBBBBBBBBB")
client.doneCh <- true
fmt.Printf("listenWrite у клиента %d работу закончил", client.id)
return
}
}
}
func (client *Client) listenRead() {
for {
select {
case <-client.doneCh:
fmt.Println("AAAAAAAAAAAA")
client.doneCh <- true
fmt.Printf("listenRead у клиента %d работу закончил", client.id)
return
}
}
}
В определенный момент происходит запись в канал:
client.doneCh <- true
Но из всех принтов выводится только BBBBBBBBBBBB
И горутина не заканчивает работу...
если закомментировать client.doneCh <- true в горутинах то отрабатывает только listenWrite и вроде как завершается, тогда не понимаю как зыкрыть вторую горутину...
Единственное что приходит в голову это на каждую горутину создавать по своему каналу для закртия... но решение не очень нравится... может есть методика закрыть все горутины через один канал?
идеологически правильно решение - каждой горутине по своему shutdown каналу, а код лучше кидать на плейграунд и в идеале, доводить его там до минимально работоспособного примера
Context with cancel, может подойти
Обсуждают сегодня