2017-01-04 11 views
2

私はchan配列を返す別の関数を呼び出す関数を持っています。私は現在、ループのループをループの範囲内で実行しています。このループは、プログラムを実行して、無期限にチャネル更新を出力します。Goルーチンを無期限に実行

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()) 
     } 
     } 
} 

main()からgetRoutes()を呼び出すと、すべてが計画通りに機能しますが、アプリケーションをブロックしています。関数が全く呼び出されていないかのように表示されますが、私はをmain()から呼び出してみました。

goルーチンを使用して非ブロッキングの方法でこの機能をバックグラウンドで実行するにはどうすればよいですか?

+0

ここで、同じ質問からの私の答えは、しばらく前に尋ねた。 http://stackoverflow.com/questions/9543835/how-best-do-i-keep-a-long-running-go-program-running/38856572#38856572 - ランタイムpkgのメソッドを使用します。 – jmaloney

答えて

1

mainのプライマリゴルーチンが終了すると、あなたが誕生した可能性のあるすべてのゴルーチンが孤立し、最終的に死にます。

あなたは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) 
    } 
    } 
} 

アップデート:スリーズ・リモンはゴルーチンがちょうどその時すぐに殺されていることを指摘しましたメイン出口。私はこれが正式に指定された行動であると考えています。

+0

'select'文で構文エラーが発生しました:'構文エラー:予期しないセミコロンまたは改行、予期しているカンマまたは} ' –

+0

ケースステートメントの最後にコロンがありませんでした。 –

+0

ありがとう、ありがとう –

0

main()は、getRoutes()-ゴールキーインの終了前に戻ります。 main()が戻ると、プログラムが終了し、実行中のすべてのゴルーチンが強制終了されます。また、ゴルーチンがゴーランタイムによってスケジュールされる機会を得る前でさえも、main()が返ることも全く可能です。

main()(または他の機能)がゴルーチンのグループが終了するのを待たせたい場合は、関数を何とか明示的に待機させる必要があります。それを行うには複数の方法があります。 sync.WaitGroup.Wait()を使用して、ゴルーチンのグループが終了するのを待つことができます。また、ゴルーチンが完了したときにチャネルを使用して通信することもできます。

関連する問題