Maison  >  Article  >  développement back-end  >  Partage de code à haute concurrence Golang

Partage de code à haute concurrence Golang

巴扎黑
巴扎黑original
2018-05-17 16:29:242515parcourir

Aujourd'hui, le leader a demandé pourquoi Golang avait été utilisé. Mon collègue a répondu que la syntaxe est simple, que le langage est nouveau et qu'il prend en charge une concurrence élevée. Comment obtenir une concurrence élevée ?L'article suivant vous présente principalement les informations pertinentes sur la façon d'utiliser Golang pour écrire du code à haute concurrence. L'article le présente en détail à travers un exemple de code. Les amis qui en ont besoin peuvent s'y référer. . Bar.

Avant-propos

J'ai toujours été confus quant à la façon dont Golang gère les requêtes http simultanées élevées. J'ai également vérifié de nombreux blogs connexes au cours des dernières années. jours. J'ai l'impression de comprendre, mais je ne sais pas comment écrire le code spécifique

Dans l'après-midi, j'ai accidentellement vu un article d'un technicien étranger sur l'application Developer Toutiao, utilisant Golang pour gérer des millions de requêtes par minute. Après avoir lu l'article, j'ai écrit le code moi-même et noté mon expérience ci-dessous

Points essentiels

Mettez le demande dans la file d'attente, un pool de travailleurs (pool) est formé par un certain nombre (tel que le nombre de cœurs de processeur) de goroutine, et les travailleurs du pool de travailleurs lisent la file d'attente et exécutent des tâches

Code d'instance

Le code suivant a été simplifié par l'auteur sur la base de sa propre compréhension, principalement pour exprimer ses idées personnelles dans le développement back-end réel. est modifié en fonction du scénario réel

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

Tests

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

Résultats des tests

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

1w les tâches sont placées dans la file d'attente et 1000 travailleurs exécutent les tâches. La consommation de temps de chaque tâche est de 200 ms, il faut plus de 2 secondes pour terminer la tâche

Ce qui précède n'est que l'opinion personnelle de l'auteur, je ne le fais pas. savoir si ma compréhension de la programmation simultanée Golang est correcte. S'il y a des erreurs, j'espère qu'un expert pourra me donner quelques conseils. Merci

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn