Qual è un modo idiomatico per assegnare un timeout a WaitGroup.Wait()?Timeout per WaitGroup.Wait()
Il motivo per cui voglio farlo, è quello di salvaguardare il mio 'scheduler' da potenzialmente in attesa di un 'operaio' errante per sempre. Questo porta ad alcune domande filosofiche (ad esempio, come può il sistema continuare in modo affidabile una volta che ha lavoratori in errore?), Ma penso che sia fuori portata per questa domanda.
Ho una risposta che fornirò. Ora che l'ho scritto, non sembra così male, ma si sente ancora più contorto di quanto dovrebbe. Mi piacerebbe sapere se c'è qualcosa che è più semplice, più idiomatico, o anche un approccio alternativo che non usa WaitGroups.
Ta.
grazie, risposta molto approfondita. Alla fine ho smesso di usare un WaitGroup del tutto, e invece ho usato un singolo canale. Il mio codice è diventato più semplice, più chiaro e "meno problematico". Il mio codice poteva contare il numero di iterazioni, quindi potevo usare l'istruzione select un numero fisso di volte, quindi usare un singolo NewTimer per il timeout. Per completezza, aggiungerò un'altra risposta a tempo debito. – laher
Quindi, un po 'di FYI visto che questo è appena spuntato in # go-nuts: Questo * non * funzionerà se le chiamate di 'wg.Add' sono * all'interno di una goroutine *. Basta commentare nel caso qualcuno usi questo codice in modo simile al numero # go-nuts appena risolto! –
se 'wg.Wait()' non ritorna mai, ha fatto trapelare una goroutine? – coanor