Il existe deux modes d'utilisation des tubes pour communiquer entre les fonctions dans le langage Go : mode producteur-consommateur : la fonction producteur écrit dans le tube, et la fonction consommateur lit le tube. Modèle de pool de travail : une fonction crée un pipeline de travail et d'autres fonctions reçoivent le travail du pipeline et l'exécutent.
Le mode de communication entre les fonctions et les tuyaux en langage Go
Les pipelines sont un mécanisme efficace de communication simultanée en langage Go. Un canal est une file d'attente tamponnée d'éléments qui peuvent être écrits à une extrémité du canal et lus à l'autre. Dans ce processus, les canaux peuvent être utilisés pour synchroniser l'exécution et transmettre des données entre les fonctions.
1. Envoi et réception de tuyaux
Un canal peut être initialisé comme un canal int, qui peut contenir n'importe quel nombre d'entiers. La fonction make
est utilisée pour créer un pipeline : make
函数用于创建管道:
numbers := make(chan int)
可以在协程中发送值到管道中,使用 chan <-
:
go func() { numbers <- 42 close(numbers) }()
可以使用 <-chan
从管道中读取值:
var num int num = <-numbers
close
函数用于关闭管道,表示管道中不再写入数据:
close(numbers)
2. 缓冲管道
管道可以是无缓冲的,这意味着管道中最多只能保存一个元素。当管道满时,写操作会被阻塞。可以通过指定第二个参数 bufferSize
来创建缓冲管道:
numbers := make(chan int, 10)
现在管道可以保存最多 10 个元素,在缓冲区填满之前,写操作不会被阻塞。
3. 函数与管道通信的模式
函数与管道通信有两种常见模式:
4. 实战案例:生产者-消费者模式
以下是一个简单的示例,展示了如何在函数之间使用管道实现生产者-消费者模式:
package main import ( "fmt" "sync" ) func producer(ch chan int) { for i := 0; i < 10; i++ { ch <- i } close(ch) } func consumer(ch chan int, wg *sync.WaitGroup) { for num := range ch { fmt.Println(num) } wg.Done() } func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(1) go producer(ch) go consumer(ch, &wg) wg.Wait() }
在这个示例中,producer
函数会将 10 个整数写入管道中,然后关闭管道。consumer
函数将会从管道中读取整数并打印出来。为了确保 consumer
函数在 producer
函数完成之前不会退出,使用了 sync.WaitGroup
rrreee
chan : 🎜rrreee🎜 peut utiliser <code>< ;-chan
Lire la valeur du tube : 🎜rrreee🎜close
La fonction est utilisée pour fermer le tube, indiquant qu'aucune donnée ne sera écrite dans le tube : 🎜rrreee🎜🎜2. Tuyau tamponné🎜🎜 🎜Les tuyaux peuvent être non tamponnés, ce qui signifie qu'un seul élément peut être enregistré dans le tuyau. Lorsque le tube est plein, les opérations d'écriture sont bloquées. Un tube tamponné peut être créé en spécifiant le deuxième paramètre bufferSize
: 🎜rrreee🎜Le tube peut désormais contenir jusqu'à 10 éléments, et les écritures ne se bloqueront pas tant que le tampon ne sera pas rempli. 🎜🎜🎜3. Modes de communication entre les fonctions et les tuyaux 🎜🎜🎜Il existe deux modes courants de communication entre les fonctions et les tuyaux : 🎜producteur
écrira 10 entiers dans le tube puis fermera le tube. La fonction consumer
lira un entier à partir du tube et l'imprimera. Pour garantir que la fonction consommateur
ne se termine pas avant la fin de la fonction producteur
, sync.WaitGroup
est utilisé pour la synchronisation. 🎜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!