Comment synchroniser les Goroutines via les canaux dans Golang
Goroutine est un thread léger dans Golang qui peut exécuter plusieurs tâches en parallèle dans un seul programme. Dans Goroutine, nous pouvons utiliser des canaux pour la communication et la synchronisation des données. Les canaux fournissent un mécanisme de communication entre les Goroutines pour garantir l'exactitude et la synchronisation des données.
Dans Golang, les canaux sont un élément de type sécurisé utilisé pour transmettre des données entre Goroutines. En utilisant les canaux, nous pouvons réaliser une synchronisation entre les Goroutines pour garantir que les données sont livrées et traitées au bon moment et dans le bon ordre.
Ensuite, regardons un exemple de code pour démontrer comment Goroutine se synchronise via les canaux :
package main import ( "fmt" "time" ) func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("Worker", id, "started job", j) time.Sleep(time.Second) fmt.Println("Worker", id, "finished job", j) results <- j * 2 } } func main() { jobs := make(chan int, 100) results := make(chan int, 100) // 启动三个 Goroutine 执行任务 for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // 发送任务到 Jobs Channel for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // 从 Results Channel 中接收结果 for a := 1; a <= 5; a++ { <-results } time.Sleep(time.Second) }
Dans l'exemple ci-dessus, nous avons créé deux canaux : jobs
et results. <code>jobs
est utilisé pour envoyer des tâches à Goroutine, et results
est utilisé pour recevoir les résultats de l'exécution des tâches. jobs
和 results
。jobs
用于发送任务到 Goroutine 中,而 results
用于接收任务执行的结果。
首先,我们通过使用 go
关键字来启动三个 Goroutine 并分别传递了它们所需的 jobs
和 results
Channels。然后,我们循环发送了 5 个任务到 jobs
Channel 中,并在完成后关闭了 jobs
Channel。
在 worker
函数中,我们使用 range
关键字来不断地从 jobs
Channel 中接收任务,并在处理完任务后将结果发送到 results
Channel 中。由于 Channel 是阻塞的,当我们从 jobs
Channel 接收到任务时,该 Goroutine 将停止并等待下一个任务的到来。
在主函数中,我们使用了 range
关键字来不断地从 results
Channel 中接收结果,在任务执行完毕后,我们通过 <-results
表达式来表示我们要接收结果数据,但实际上我们不会使用这些值。
最后,在主函数中,我们使用了一个延迟函数 time.Sleep(time.Second)
go
et avons transmis respectivement leurs canaux jobs
et results
requis. Ensuite, nous avons envoyé 5 tâches au canal jobs
en boucle et avons fermé le canal jobs
une fois terminé. Dans la fonction worker
, nous utilisons le mot-clé range
pour recevoir en continu des tâches du canal jobs
, et après avoir traité les tâches, les résultats sont envoyés au canal results
. Puisque le canal se bloque, lorsque nous recevons une tâche du canal jobs
, la Goroutine s'arrêtera et attendra l'arrivée de la tâche suivante. Dans la fonction principale, nous utilisons le mot-clé range
pour recevoir en continu les résultats du canal results
Une fois la tâche terminée, nous transmettons <
pour indiquer que nous souhaitons recevoir les données de résultat, mais nous n'utiliserons pas réellement ces valeurs. 🎜🎜Enfin, dans la fonction principale, nous utilisons une fonction de retard time.Sleep(time.Second)
pour garantir que le programme ne se termine pas immédiatement après l'exécution de Goroutine. 🎜🎜Grâce à l'exemple de code ci-dessus, nous pouvons voir qu'en utilisant les canaux, nous pouvons réaliser la synchronisation entre les Goroutines pour garantir l'exactitude et l'ordre des données. Dans les applications réelles, nous pouvons créer différents types de canaux selon les besoins pour répondre à divers besoins. 🎜🎜Pour résumer, la synchronisation entre les Goroutines dans Golang via les canaux est un mécanisme simple et puissant. Il assure non seulement la communication entre les threads, mais garantit également l'exactitude et la synchronisation des données, offrant ainsi commodité et flexibilité pour la programmation simultanée. 🎜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!