2017-01-04 5 views
2

У меня есть функция, которая вызывает другую функцию, которая возвращает массив chan. В настоящее время у меня есть цикл for loop по диапазону в массиве, который запускает программу, неопределенно выводя обновления канала в момент прохождения.Выполнение рутинной операции неограниченное

func getRoutes() { 
     for r := range rtu { 
     if r.Type == 24 { 
      fmt.Printf("Route added: %s via %s\n",r.Dst.String(),r.Gw.String()) 
     } else if r.Type == 25 { 
      fmt.Printf("Route deleted: %s via %s\n",r.Dst.String(),r.Gw.String()) 
     } 
     } 
} 

Когда я называю getRoutes() из основного() все работает, как и планировалось, хотя, это блокирует приложение. Я попытался позвонить go getRoutes() из main(), хотя кажется, что функция вообще не вызывается.

Как я могу запустить эту функцию в фоновом режиме неблокирующим способом с помощью подпрограмм go?

+0

Вот мой ответ из того же вопроса, который задал некоторое время назад. http://stackoverflow.com/questions/9543835/how-best-do-i-keep-a-long-running-go-program-running/38856572#38856572 - Он использует метод из runtime pkg. – jmaloney

ответ

1

Когда вы покинете основную горутун в main, все роутины, которые вы, возможно, породили, останутся сиротами и в конечном итоге умрут.

Вы можете сохранить основной goroutine работает навсегда с бесконечным циклом с for {}, но вы можете сохранить выездную канал вместо:

exit := make(chan string) 

// Spawn all you worker goroutines, and send a message to exit when you're done. 

for { 
    select { 
    case <- exit: { 
     os.Exit(0) 
    } 
    } 
} 

Update: Cerise Limón отметил, что goroutines просто убиты сразу после основные выходы. Я думаю, что это должно быть официально указанное поведение.

+0

Получение синтаксической ошибки в выражении 'select':' синтаксическая ошибка: неожиданная точка с запятой или новая строка, ожидающая запятая или} ' –

+0

Думаю, я пропустил двоеточие в конце оператора case. –

+0

Вы сделали, спасибо mate –

0

Ваш main() возвращается до getRoutes() -goroutine отделки. Когда возвращается main(), программа завершает работу, тем самым убивая всех работающих goroutines. (Также вполне возможно, что main() возвращается еще до того, как goroutine получит возможность получить запланированное время работы.)

Если вы хотите, чтобы main() (или любая другая функция) дождалась завершения группы горти, должны заставить функцию явно ждать как-то. Существует несколько способов сделать это. sync.WaitGroup.Wait() можно использовать, чтобы дождаться окончания группы горутов. Вы также можете использовать каналы для общения, когда выполняются goroutines.

Смежные вопросы