2017-02-05 5 views
-1

一般に、Goルーチンのメモリ要件とセットアップ/切断コストの点で、オーバーヘッドはほとんどありません。それはスレッド(作業を行っている)ワーカープールを実装することさえ関係がありますか?スレッドプールを使用することは、リクエストごとに「スポーンする」のではなく、いつ使うのですか?「スレッドプール」はGoに関連していますか?

+0

ブロッキングIOを使用している場合は、goroutineの代わりにスレッドプールを使用することを検討する必要があります。 – ymonad

+0

@ymonad、IOをブロックすることはどういう意味ですか?すべてのIOはブロックされていますが、それはちょっとしたことで、並行性モデルです。内部的にネットワークIOと大きく異なるファイルIOを意味する場合、問題はゴルーチンに関するものではありません。これは、実際のOSスレッドがsyscallsを返すのを待っていることです。 – creker

+0

@crecker私が意図したことは、ノンブロッキングであるgoのネットワークライブラリを使用する限り、goroutineのM:Nスレッドモデルの利点を得ることです。ただし、IOをブロックするシステムコールを使用すると、 goroutineごとに1つのスレッドを作成するので、スレッドプールを使用することがオプションになります。 https://groups.google.com/forum/#!topic/golang-nuts/Luje-okL4jI – ymonad

答えて

2

ゴランの産卵とたくさんのゴルーチンは安いですが、それは無料ではありません。

また、goroutine自体は非常に安いかもしれませんが、同時に多くのメモリをgoroutineコードの内側に割り当てることができます。したがって、同時実行しているゴルーチンの数を制限することができます。

リソースを制限するためにセマフォを使用できます。 もう1つのアプローチ(もっと慣れない)は、ワーカープールで実行パイプラインを使用することです。このパターンは、golang blogに詳しく記載されています。

1

はい、該当します。 db/sqlは、新しい接続に時間がかかるため、データベースへの接続プールを使用します。

+1

これは少し話題です - データベース接続のプールはスレッドプールと全く同じではありません。 –

関連する問題