SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
PROGRESS
                                  1




  Faisons	travailler
des	gophers	ensemble
PROGRESS
                          2




Présentation
PROGRESS
                                                    3




Bruno	Michel
✰ Directeur	Technique	d'     af83
✰ Développeur	de	   LinuxFr.org
✰ Ancien	président	de	     Ruby	France
✰ github.com/nono
✰ twitter.com/brmichel
PROGRESS
                                                                                                       4




Gophers
«	 Gaufre	(ou	gauphre)	est	un	nom	vernaculaire	ambigu	en	français,	pouvant	désigner
des	rongeurs	[…] 	»
                                                                                 —	 Wikipédia
PROGRESS
                                                                        5




Go
✰ Langage	Open	Source,	géré	par	la	communauté
✰ Une	version	stable,	Go	1
✰ Langage	moderne	et	agréable	à	utiliser
✰ Pour	faire	des	logiciels	simples,	performants	et	fiables
PROGRESS
                                         6




Concurrence	et	parallélisme
PROGRESS
                                                                                         7




Concurrence
«	 Programming	as	the	composition	of	independently	executing
processes. 	»
                                                               —	 Ro b	 P i k e
PROGRESS
                                                                                                               8




Parallélisme
«	 Programming	as	the	simultaneous	execution	of	(possibly	related)	computations.   	»
                                                                                        — 	 Ro b 	Pik e
PROGRESS
                                                                9




Concurrence	vs.	parallélisme
Concurrence	:	une	question	de	structure	de	données
Parallélisme	:	à	propos	de	l'exécution
PROGRESS
                              10




Les	primitives	de	Go
PROGRESS
                                                  11




Goroutine
func	computation(n	int)	{
				time.Sleep(n	*	time.Milliseconds)
				fmt.Printf("%s	seconds	elapsedn",	n)
}
go	computation(3)
go	computation(1)
go	computation(5)
computation(7)
PROGRESS
                                           12




Channels
func	pingpong(ch	chan	int)	{
				n	:=	<-ch
				fmt.Printf("Received	%dn",	n)
				ch	<-	n
}


func	main()	{
				ch	:=	make(chan	int)
				go	pingpong(ch)
				ch	<-	42
				<-ch
}
PROGRESS
                                           13




Buffered	Channels
func	pingpong(ch	chan	int)	{
				n	:=	<-ch
				fmt.Printf("Received	%dn",	n)
				ch	<-	n
}


func	main()	{
				ch	:=	make(chan	int,	5)
				go	pingpong(ch)
				ch	<-	42
				<-ch
}
PROGRESS
                                  14




Select
select	{
				case	chan1	<-	nb:
								fmt.Printf("c1")
				case	str	:=	<-chan2:
								fmt.Printf("c2")
				case	str	:=	<-chan3:
								fmt.Printf("c3")
}
PROGRESS
                           15




Quelques	patterns
PROGRESS
                                   16




Génerateur
func	idGenerator()	chan	int	{
				ids	:=	make(chan	int)
				go	func()	{
								id	:=	0
								for	{
												ch	<-	id
												id++
								}
				}
				return	ids
}


ids	:=	idGenerator()
id1	:=	<-ids
id2	:=	<-ids
PROGRESS
                                                 17




Timeout
select	{
				case	n	:=	<-ch:
								fmt.Printf("Received	%d",	n)
				case	<-time.After(2	*	time.Seconds)
								fmr.Printf("Too	late")
}
PROGRESS
                                                         18




Tickers
ticker	:=	time.NewTicker(50	*	time.Millisecond)	
go	func()	{
				for	t	:=	range	ticker.C	{
								fmt.Println("Tick	at",	t)
				}
}()


time.Sleep(150	*	time.Millisecond)
ticker.Stop()
PROGRESS
                                         19




Worker
func	worker(in	<-chan	*Work,
												out	chan<-	*Work)	{
			for	w	:=	range	in	{
						w.z	=	w.x	*	w.y
						Sleep(w.z)
						out	<-	w
			}
}
PROGRESS
                                             20




Load	balancer
func	Run()	{
			in		:=	make(chan	*Work)
			out	:=	make(chan	*Work)
			for	i	:=	0;	i	<	NumWorkers;	i++	{
							go	worker(in,	out)
			}
			go	sendLotsOfWork(in)
			receiveLotsOfResults(out)
}
PROGRESS
                    21




Conclusion
PROGRESS
                                    22




Goroutines	+	Channels	=	<3
✰ Ni	mutex
✰ Ni	semaphore
✰ Mais	c'est	très	puissant
PROGRESS
                                                  23




Mise	en	application
External	images	for	LinuxFr.org
https://github.com/nono /img-LinuxFr.org
PROGRESS
                                                                 24




Pour	aller	plus	loin
Concurrency	is	not	Parallelism	(it's	better)	—	Rob	Pike
http://waza.heroku.com/

Contenu connexe

Similaire à OWF12/OSDC.Fr Golang concurrency patterns

GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
Guillaume Laforge
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
Mohammed TAMALI
 

Similaire à OWF12/OSDC.Fr Golang concurrency patterns (20)

Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsAu secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOps
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
Pipeline Devops - Intégration continue : ansible, jenkins, docker, jmeter...
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
 
Openshift 3 & Kubernetes
Openshift 3 & KubernetesOpenshift 3 & Kubernetes
Openshift 3 & Kubernetes
 
Installation open erp
Installation open erpInstallation open erp
Installation open erp
 
Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...Techniques de programmation avancée LabVIEW : gestion des données de la local...
Techniques de programmation avancée LabVIEW : gestion des données de la local...
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
Intégration continue
Intégration continueIntégration continue
Intégration continue
 
Retour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, KubernetesRetour d'expérience technique Go, gRPC, Kubernetes
Retour d'expérience technique Go, gRPC, Kubernetes
 
Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++Comment développer un serveur métier en python/C++
Comment développer un serveur métier en python/C++
 
C3 - Langage C - ISIMA 1 - Troisieme partie
C3 - Langage C - ISIMA 1 - Troisieme partieC3 - Langage C - ISIMA 1 - Troisieme partie
C3 - Langage C - ISIMA 1 - Troisieme partie
 
Sec day cuckoo_workshop
Sec day cuckoo_workshopSec day cuckoo_workshop
Sec day cuckoo_workshop
 
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
CI, CD, pipelines, conteneurs : la cohabitation est elle possible ?
 
Explorez vos données présentes dans MongoDB avec Apache Zeppelin
Explorez vos données présentes dans MongoDB avec Apache ZeppelinExplorez vos données présentes dans MongoDB avec Apache Zeppelin
Explorez vos données présentes dans MongoDB avec Apache Zeppelin
 
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et rosTp2: Installation d'une couche d’abstraction entre un robot physique et ros
Tp2: Installation d'une couche d’abstraction entre un robot physique et ros
 
presentation Ganttproject (TIC et orga)
presentation Ganttproject (TIC et orga)presentation Ganttproject (TIC et orga)
presentation Ganttproject (TIC et orga)
 
L’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacketL’environnement de programmation fonctionnelle DrRacket
L’environnement de programmation fonctionnelle DrRacket
 
12 03 19_n7_openfoam_presentation_generale
12 03 19_n7_openfoam_presentation_generale12 03 19_n7_openfoam_presentation_generale
12 03 19_n7_openfoam_presentation_generale
 

Plus de Paris Open Source Summit

#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
Paris Open Source Summit
 
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
Paris Open Source Summit
 

Plus de Paris Open Source Summit (20)

#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
#OSSPARIS19 : Control your Embedded Linux remotely by using WebSockets - Gian...
 
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
#OSSPARIS19 : A virtual machine approach for microcontroller programming : th...
 
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
#OSSPARIS19 : RIOT: towards open source, secure DevOps on microcontroller-bas...
 
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
#OSSPARIS19 : The evolving (IoT) security landscape - Gianluca Varisco, Arduino
 
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
#OSSPARIS19: Construire des applications IoT "secure-by-design" - Thomas Gaza...
 
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
#OSSPARIS19 : Detecter des anomalies de séries temporelles à la volée avec Wa...
 
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
#OSSPARIS19 : Supervision d'objets connectés industriels - Eric DOANE, Zabbix
 
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
#OSSPARIS19: Introduction to scikit-learn - Olivier Grisel, Inria
 
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
#OSSPARIS19 - Fostering disruptive innovation in AI with JEDI - André Loesekr...
 
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches  ...
#OSSPARIS19 : Comment ONLYOFFICE aide à organiser les travaux de recherches ...
 
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
#OSSPARIS19 : MDPH : une solution collaborative open source pour l'instructio...
 
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
#OSSPARIS19 - Understanding Open Source Governance - Gilles Gravier, Wipro Li...
 
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
#OSSPARIS19 : Publier du code Open Source dans une banque : Mission impossibl...
 
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
#OSSPARIS19 : Libre à vous ! Raconter les libertés informatiques à la radio -...
 
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
#OSSPARIS19 - Le logiciel libre : un enjeu politique et social - Etienne Gonn...
 
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
#OSSPARIS19 - Conflits d’intérêt & concurrence : la place de l’éditeur dans l...
 
#OSSPARIS19 - Table ronde : souveraineté des données
#OSSPARIS19 - Table ronde : souveraineté des données #OSSPARIS19 - Table ronde : souveraineté des données
#OSSPARIS19 - Table ronde : souveraineté des données
 
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
#OSSPARIS19 - Comment financer un projet de logiciel libre - LUDOVIC DUBOST, ...
 
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
#OSSPARIS19 - BlueMind v4 : les dessous technologiques de 10 ans de travail p...
 
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
#OSSPARIS19 - Tuto de première installation de VITAM, un système d'archivage ...
 

OWF12/OSDC.Fr Golang concurrency patterns

  • 1. PROGRESS 1 Faisons travailler des gophers ensemble
  • 2. PROGRESS 2 Présentation
  • 3. PROGRESS 3 Bruno Michel ✰ Directeur Technique d' af83 ✰ Développeur de LinuxFr.org ✰ Ancien président de Ruby France ✰ github.com/nono ✰ twitter.com/brmichel
  • 4. PROGRESS 4 Gophers « Gaufre (ou gauphre) est un nom vernaculaire ambigu en français, pouvant désigner des rongeurs […] » — Wikipédia
  • 5. PROGRESS 5 Go ✰ Langage Open Source, géré par la communauté ✰ Une version stable, Go 1 ✰ Langage moderne et agréable à utiliser ✰ Pour faire des logiciels simples, performants et fiables
  • 6. PROGRESS 6 Concurrence et parallélisme
  • 7. PROGRESS 7 Concurrence « Programming as the composition of independently executing processes. » — Ro b P i k e
  • 8. PROGRESS 8 Parallélisme « Programming as the simultaneous execution of (possibly related) computations. » — Ro b Pik e
  • 9. PROGRESS 9 Concurrence vs. parallélisme Concurrence : une question de structure de données Parallélisme : à propos de l'exécution
  • 10. PROGRESS 10 Les primitives de Go
  • 11. PROGRESS 11 Goroutine func computation(n int) { time.Sleep(n * time.Milliseconds) fmt.Printf("%s seconds elapsedn", n) } go computation(3) go computation(1) go computation(5) computation(7)
  • 12. PROGRESS 12 Channels func pingpong(ch chan int) { n := <-ch fmt.Printf("Received %dn", n) ch <- n } func main() { ch := make(chan int) go pingpong(ch) ch <- 42 <-ch }
  • 13. PROGRESS 13 Buffered Channels func pingpong(ch chan int) { n := <-ch fmt.Printf("Received %dn", n) ch <- n } func main() { ch := make(chan int, 5) go pingpong(ch) ch <- 42 <-ch }
  • 14. PROGRESS 14 Select select { case chan1 <- nb: fmt.Printf("c1") case str := <-chan2: fmt.Printf("c2") case str := <-chan3: fmt.Printf("c3") }
  • 15. PROGRESS 15 Quelques patterns
  • 16. PROGRESS 16 Génerateur func idGenerator() chan int { ids := make(chan int) go func() { id := 0 for { ch <- id id++ } } return ids } ids := idGenerator() id1 := <-ids id2 := <-ids
  • 17. PROGRESS 17 Timeout select { case n := <-ch: fmt.Printf("Received %d", n) case <-time.After(2 * time.Seconds) fmr.Printf("Too late") }
  • 18. PROGRESS 18 Tickers ticker := time.NewTicker(50 * time.Millisecond) go func() { for t := range ticker.C { fmt.Println("Tick at", t) } }() time.Sleep(150 * time.Millisecond) ticker.Stop()
  • 19. PROGRESS 19 Worker func worker(in <-chan *Work, out chan<- *Work) { for w := range in { w.z = w.x * w.y Sleep(w.z) out <- w } }
  • 20. PROGRESS 20 Load balancer func Run() { in := make(chan *Work) out := make(chan *Work) for i := 0; i < NumWorkers; i++ { go worker(in, out) } go sendLotsOfWork(in) receiveLotsOfResults(out) }
  • 21. PROGRESS 21 Conclusion
  • 22. PROGRESS 22 Goroutines + Channels = <3 ✰ Ni mutex ✰ Ni semaphore ✰ Mais c'est très puissant
  • 23. PROGRESS 23 Mise en application External images for LinuxFr.org https://github.com/nono /img-LinuxFr.org
  • 24. PROGRESS 24 Pour aller plus loin Concurrency is not Parallelism (it's better) — Rob Pike http://waza.heroku.com/