Heim  >  Artikel  >  Backend-Entwicklung  >  Golang-Codefreigabe mit hoher Parallelität

Golang-Codefreigabe mit hoher Parallelität

巴扎黑
巴扎黑Original
2018-05-17 16:29:242616Durchsuche

Heute fragte der Leiter, warum Golang verwendet wurde. Mein Kollege antwortete, dass die Syntax einfach sei, die Sprache neu sei und eine hohe Parallelität unterstütze. Wie erreicht man eine hohe Parallelität? Der folgende Artikel stellt Ihnen hauptsächlich die relevanten Informationen zur Verwendung von Golang zum Schreiben von Code mit hoher Parallelität vor. Freunde, die ihn benötigen, können einen Blick darauf werfen . Bar.

Vorwort

Ich war immer verwirrt darüber, wie Golang mit vielen gleichzeitigen HTTP-Anfragen umgeht. Ich habe in den letzten paar Blogs auch viele verwandte Blogs überprüft Ich scheine es zu verstehen, aber ich weiß nicht, wie ich den spezifischen Code schreiben soll

Am Nachmittag habe ich versehentlich einen Artikel eines ausländischen Technikers über die Developer Toutiao APP gesehen, in dem er Golang zur Verarbeitung von Millionen verwendet Anfragen pro Minute. Nachdem ich den Artikel gelesen hatte, habe ich den Code selbst geschrieben und unten meine Erfahrungen niedergeschrieben

Kernpunkte

Setzen Sie die Anforderung in die Warteschlange, ein Worker-Pool (Pool) wird durch eine bestimmte Anzahl (z. B. die Anzahl der CPU-Kerne) von Goroutinen gebildet, und die Worker im Worker-Pool lesen die Warteschlange und führen Aufgaben aus

Instanzcode

Der folgende Code wurde vom Autor basierend auf seinem eigenen Verständnis vereinfacht, hauptsächlich um seine persönlichen Ideen in der tatsächlichen Backend-Entwicklung auszudrücken wird entsprechend dem tatsächlichen Szenario geändert

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()
 }
}

Testen

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()
}

Testergebnisse

pkg: golang-study-demo/goroutine
1 2029931652 ns/op
PASS

1w Aufgaben werden in die Warteschlange gestellt und 1000 Arbeiter führen die Aufgaben aus. Der Zeitaufwand für jede Aufgabe beträgt 200 ms, es dauert mehr als 2 s, um die Aufgabe abzuschließen

Das Obige ist nur die persönliche Meinung des Autors Ich weiß, ob mein Verständnis der gleichzeitigen Golang-Programmierung korrekt ist. Ich hoffe, ein Experte kann mir einen Rat geben

Das obige ist der detaillierte Inhalt vonGolang-Codefreigabe mit hoher Parallelität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn