今日、リーダーが Golang を使用する理由を尋ねたところ、私の同僚は、構文が単純で、言語が新しく、高い同時実行性をサポートしていると答えました。高い同時実行性を実現するには、次の記事で、Golang を使用して高い同時実行性のコードを作成する方法について詳しく説明します。必要な方は参照してください。 。 バー。
前書き
私は、Golang が大量の http リクエストをどのように処理するかについて常に混乱していました。ここ数日、多くの関連ブログをチェックしましたが、具体的な書き方がわかりません。コード
午後に偶然、開発者のToutiao APPは、Golangを使用して毎分数百万のリクエストを処理する外国人技術者の記事を目にしました。その記事のコードを読んだ後、自分の経験を以下に書きます。
コアポイント
リクエストをキューに入れ、一定数(CPUコア数など)のゴルーチンを通じてワーカープール(プール)を形成し、ワーカープール内のワーカーがキューを読み込むタスクを実行する
サンプルコード
以下のコードは、主に個人的なアイデアを表現するために、作成者が独自の理解に基づいて簡略化したものであり、実際のバックエンド開発では、に従って変更されます。実際のシナリオ
func doTask() { //耗时炒作(模拟) time.Sleep(200 * time.Millisecond) wg.Done() } //这里模拟的http接口,每次请求抽象为一个job func handle() { //wg.Add(1) job := Job{} JobQueue <- job } var ( MaxWorker = 1000 MaxQueue = 200000 wg sync.WaitGroup ) type Worker struct { quit chan bool } func NewWorker() Worker { return Worker{ quit: make(chan bool)} } // Start method starts the run loop for the worker, listening for a quit channel in // case we need to stop it func (w Worker) Start() { go func() { for { select { case <-JobQueue: // we have received a work request. doTask() case <-w.quit: // we have received a signal to stop return } } }() } // Stop signals the worker to stop listening for work requests. func (w Worker) Stop() { go func() { w.quit <- true }() } type Job struct { } var JobQueue chan Job = make(chan Job, MaxQueue) type Dispatcher struct { } func NewDispatcher() *Dispatcher { return &Dispatcher{} } func (d *Dispatcher) Run() { // starting n number of workers for i := 0; i < MaxWorker; i++ { worker := NewWorker() worker.Start() } }
テスト
func Benchmark_handle(b *testing.B) { runtime.GOMAXPROCS(runtime.NumCPU()) d := NewDispatcher() d.Run() for i:=0;i<10000;i++ { wg.Add(1) handle() } wg.Wait() }
テスト結果
pkg: golang-study-demo/goroutine 1 2029931652 ns/op PASS
1wタスクキューに入れると、1000人のワーカーがタスクを実行し、各タスクは200ミリ秒かかり、タスクを完了するまでに2秒以上かかります
上記は単なる著者の個人的な意見です。Golang 同時プログラミングについての私の理解が正しいかどうか、または間違いがあるかどうかはわかりません。専門家にアドバイスをいただければ幸いです。ありがとうございます。
以上がGolang の高い同時実行コード共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。