Go 言語のスレッド プールとタスク キュー
コンピューター技術の継続的な発展に伴い、マルチスレッド プログラミングが主流のプログラミング方法になりました。スレッド プールとタスク キューは、マルチスレッド プログラミングにおける 2 つの非常に重要な概念です。 Go 言語では、スレッド プールとタスク キューも非常に重要な役割を果たします。
1. スレッド プール
スレッド プールとは、あらかじめ一定数のスレッドを作成してプールに格納しておくもので、タスクを実行する必要があるときに、アイドル状態のスレッドがプールから取り出されます。スレッド プール。タスクを実行します。この方法では、コンピュータの CPU リソースを最大限に活用し、スレッドの頻繁な作成と破棄によって引き起こされるパフォーマンスの問題を回避できます。
Go言語ではスレッドの代わりにゴルーチン(コルーチン)が使われます。 Goroutine は Go 言語の軽量スレッドです。複数の goroutine を 1 つのスレッドで作成できます。各 goroutine は、ほとんど消費せずにタスクを並列実行できます。スレッド プールを使用すると、ゴルーチンの使用がさらに最適化され、ゴルーチンの作成と破棄が頻繁に行われることによって引き起こされるパフォーマンスの問題を回避できます。
Go 言語にはスレッド プール実装も組み込まれており、通常、使用可能なゴルーチンの数は、標準ライブラリの runtime.GOMAXPROCS
関数を呼び出すことで設定されます。たとえば、次のコードを使用して、CPU コアの数に対して使用可能なゴルーチンの数を設定できます。
import "runtime" func main() { num := runtime.NumCPU() // 获取CPU核心数 runtime.GOMAXPROCS(num) // 设置可用的goroutine数量 }
現在実行中のゴルーチンの数は、runtime.NumGoroutine
を通じて取得できます。重要なのは、使用可能なゴルーチンの数をできるだけ多く設定せず、最適な効果を得るために実際の状況に応じて調整する必要があるということです。
2. タスク キュー
タスク キューは、実行するタスクを格納するために使用されるキューです。アプリケーションはタスクをキューに入れ、スレッド プール内のスレッドは流れ続けます。タスクキューからタスクを取得して実行します。タスク キューは通常、先入れ先出し (FIFO) 方式を使用してタスクを実行します。これにより、新しく追加されたタスクは常に既存のタスクの後ろにキューに入れられ、既存のタスクが最初に実行されます。
Go 言語では、channel
を使用してタスク キューを実装でき、ゴルーチンはチャネルを通じて通信できます。たとえば、次のコードを使用してバッファ付きのチャネルを作成できます。
taskChan := make(chan Task, 10) // 创建带有缓冲区的任务队列
ここでは、10 個のタスクを保存できるタスク キューが make
関数によって作成されます。プロデューサーの goroutine は、タスクをタスク キューに入れる必要がある場合、taskChan
を通じて行うことができます。たとえば、次のコードを使用してタスク キューにタスクを入れることができます。
task := Task{...} // 创建一个任务 taskChan <- task // 将任务放入任务队列
コンシューマー goroutine がタスク キューからタスクを取り出して実行する必要がある場合、## を通じて操作することもできます。 #タスクチャン 。たとえば、次のコードを使用してタスク キューからタスクを取り出して実行できます。
task := <-taskChan // 从任务队列中取出一个任务 task.Execute() // 执行该任务
channel を使用してタスク キューを実装すると、次のコードを実行することもできます。 goroutine の過剰な作成と goroutine の破棄によって引き起こされる過剰なパフォーマンスの問題。
sync.WaitGroup を使用して、すべての goroutine の実行が完了するのを待つことができます。たとえば、次のコードを使用して、すべての goroutine の実行が完了するのを待つことができます:
var wg sync.WaitGroup // 定义WaitGroup对象 // 添加goroutine到WaitGroup中 for i := 0; i < num; i++ { wg.Add(1) go func() { // 处理任务队列中的任务 ... wg.Done() }() } // 等待所有goroutine执行完成 wg.Wait()
以上がGo言語のスレッドプールとタスクキューの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。