ホームページ  >  記事  >  バックエンド開発  >  Golang の高い同時実行コード共有

Golang の高い同時実行コード共有

巴扎黑
巴扎黑オリジナル
2018-05-17 16:29:242611ブラウズ

今日、リーダーが 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。