Go を使用して Yahoo ファイナンスから株価スプレッドシートをダウンロードしたいと考えています。独自のゴルーチンですべての株式に対して http リクエストを作成します。約 2500 個のシンボルのリストがありますが、2500 個のリクエストを並行して行うのではなく、一度に 250 個を作成することをお勧めします。Java では、スレッド プールを作成し、スレッドが解放されたときにスレッドを再利用します。似たようなもの、ゴルーチンプールを探していましたが、リソースを見つけることができませんでした。誰かが目の前のタスクを達成する方法を教えてくれたり、同じリソースを教えてくれたりしてくれれば幸いです。ありがとう!
31503 次
4 に答える
63
最も簡単な方法は、250 個のゴルーチンを作成し、メインのゴルーチンから子のゴルーチンにリンクを渡すために使用できるチャネルを渡し、そのチャネルをリッスンすることだと思います。
すべてのリンクがゴルーチンに渡されると、チャネルが閉じられ、すべてのゴルーチンがジョブを終了します。
子供たちがデータを処理する前にメインのゴルーチンが終了しないようにするには、 を使用できますsync.WaitGroup
。
上記で説明したコードを次に示します (最終的な作業バージョンではありませんが、要点を示しています)。
func worker(linkChan chan string, wg *sync.WaitGroup) {
// Decreasing internal counter for wait-group as soon as goroutine finishes
defer wg.Done()
for url := range linkChan {
// Analyze value and do the job here
}
}
func main() {
lCh := make(chan string)
wg := new(sync.WaitGroup)
// Adding routines to workgroup and running then
for i := 0; i < 250; i++ {
wg.Add(1)
go worker(lCh, wg)
}
// Processing all links by spreading them to `free` goroutines
for _, link := range yourLinksSlice {
lCh <- link
}
// Closing channel (waiting in goroutines won't continue any more)
close(lCh)
// Waiting for all goroutines to finish (otherwise they die as main routine dies)
wg.Wait()
}
于 2013-08-16T07:19:17.760 に答える