Maison >développement back-end >Tutoriel Python >Partage de code à haute concurrence Golang
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!