


Comment résoudre le problème de l'expansion dynamique des tâches simultanées en langage Go ?
Comment résoudre le problème de l'expansion dynamique des tâches simultanées en langage Go ?
Lorsqu'un grand nombre de tâches simultanées doivent être traitées, nous devrons peut-être ajuster dynamiquement le nombre de goroutines simultanées pour obtenir un traitement efficace des tâches. Dans le langage Go, vous pouvez utiliser goroutine et canal pour implémenter une programmation simultanée. En ajustant le nombre de goroutines, vous pouvez contrôler efficacement l'exécution de tâches simultanées.
Afin de résoudre le problème de l'expansion dynamique des tâches simultanées, nous pouvons utiliser un pool de goroutines pour gérer le nombre de goroutines simultanées et utiliser des canaux pour distribuer les tâches et collecter les résultats. Voici un exemple de code :
package main import ( "fmt" "sync" "time" ) type Pool struct { queue chan Job wg sync.WaitGroup } type Job struct { id int result string } func NewPool(maxWorkers int) *Pool { pool := &Pool{ queue: make(chan Job), } for i := 0; i < maxWorkers; i++ { go pool.worker(i) } return pool } func (p *Pool) worker(id int) { for job := range p.queue { fmt.Printf("Worker %d processing job %d ", id, job.id) time.Sleep(time.Second) // 模拟任务耗时 job.result = fmt.Sprintf("Job %d processed by worker %d", job.id, id) p.wg.Done() } } func (p *Pool) AddJob(job Job) { p.wg.Add(1) p.queue <- job } func (p *Pool) Wait() { p.wg.Wait() close(p.queue) } func main() { pool := NewPool(3) for i := 1; i <= 10; i++ { job := Job{id: i} pool.AddJob(job) } pool.Wait() }
Dans l'exemple de code ci-dessus, nous définissons une structure Pool
pour gérer le pool de goroutines, qui contient un canal pour stocker les tâches et un canal pour attendre tout sync.WaitGroup
lorsque la tâche est terminée. Pool
结构体来管理goroutine池,其中包含一个用于存放任务的channel和一个用于等待所有任务完成的sync.WaitGroup
。
NewPool
函数用于创建一个新的goroutine池,其中会根据指定的maxWorkers
参数创建对应数量的goroutine,并调用worker
函数进行任务的处理。
worker
函数为每个goroutine的主体函数,它通过从任务channel中获取任务,并处理任务。在处理任务之前,可以根据具体需求进行一些预处理或其他操作。任务处理完成后,将结果赋值给job.result
字段,并通过sync.WaitGroup
的Done
方法来通知任务完成。
AddJob
方法用于添加新的任务到任务channel中,它会通过sync.WaitGroup
的Add
方法增加等待的任务数量,并将任务放入队列中。
Wait
方法用于等待所有任务完成,它会调用sync.WaitGroup
的Wait
方法来阻塞主线程,直到所有任务都被完成。
最后,在main
函数中,我们创建了一个大小为3的goroutine池,并添加了10个任务。通过调整maxWorkers
NewPool
est utilisée pour créer un nouveau pool de goroutines, qui créera un nombre correspondant de goroutines en fonction du paramètre maxWorkers
spécifié et appellera worker code> La fonction effectue le traitement des tâches. <p></p>La fonction <code>worker
est la fonction principale de chaque goroutine. Elle obtient les tâches du canal de tâches et traite les tâches. Avant de traiter la tâche, certains prétraitements ou autres opérations peuvent être effectués en fonction de besoins spécifiques. Une fois le traitement de la tâche terminé, attribuez le résultat au champ job.result
et notifiez l'achèvement de la tâche via la méthode Done
de sync.WaitGroup
. 🎜🎜La méthode AddJob
est utilisée pour ajouter de nouvelles tâches au canal de tâches. Elle augmentera le nombre de tâches en attente via la méthode Add
de sync.WaitGroup<.> et place la tâche dans la file d'attente. 🎜🎜La méthode <code>Wait
est utilisée pour attendre que toutes les tâches soient terminées. Elle appellera la méthode Wait
de sync.WaitGroup
pour bloquer le. fil principal jusqu'à ce que toutes les tâches soient terminées. 🎜🎜Enfin, dans la fonction main
, nous avons créé un pool de goroutines de taille 3 et ajouté 10 tâches. En ajustant la valeur du paramètre maxWorkers
, nous pouvons ajuster dynamiquement le nombre de goroutines simultanées. 🎜🎜Avec l'exemple de code ci-dessus, nous pouvons facilement résoudre le problème de l'expansion dynamique des tâches simultanées. En contrôlant raisonnablement le nombre de goroutines simultanées, nous pouvons utiliser le mécanisme de concurrence du langage Go pour obtenir un traitement efficace des tâches. 🎜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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Deux façons de définir les structures dans le langage GO: la différence entre les mots clés VAR et le type. Lorsque vous définissez des structures, GO Language voit souvent deux façons d'écrire différentes: d'abord ...

Lorsque vous utilisez SQL.Open, pourquoi le DSN ne signale-t-il pas une erreur? En langue go, sql.open ...
