{"version":3,"sources":["webpack:///./src/assets/images/application_channel_chans.png","webpack:///./src/assets/images/channel_communication_between_goroutines.png","webpack:///./src/assets/images/select_statement_syntax.png","webpack:///./src/assets/images/channel_direction.png","webpack:///./src/assets/images/channel_summary.png","webpack:///./src/views/Chap30Concurrency.vue?878b","webpack:///src/views/Chap30Concurrency.vue","webpack:///./src/views/Chap30Concurrency.vue?09d0","webpack:///./src/views/Chap30Concurrency.vue","webpack:///./src/assets/images/five_dining_philo.png","webpack:///./src/assets/images/deadluck_unbuffered.png","webpack:///./src/assets/images/channel_unbuffered_buffered.png","webpack:///./src/assets/images/ps-xau-example.png"],"names":["module","exports","render","_vm","this","_h","$createElement","_c","_self","staticClass","attrs","_v","directives","name","rawName","pre","staticStyle","staticRenderFns","components","FeedbackInvite","BuyCopyInvite","NewsletterInput","ChapterHeading","ChapterBibliography","TOCChapter","NavBar","BIconLink45deg","Footer","created","window","data","publicPath","metaInfo","title","htmlAttrs","lang","meta","charset","content","property","link","rel","href","component"],"mappings":"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","file":"js/chunk-bdc6a4dc.f182409c.js","sourcesContent":["module.exports = __webpack_public_path__ + \"img/application_channel_chans.20d8e3b2.png\";","module.exports = __webpack_public_path__ + \"img/channel_communication_between_goroutines.869158ee.png\";","module.exports = __webpack_public_path__ + \"img/select_statement_syntax.78dbdc87.png\";","module.exports = __webpack_public_path__ + \"img/channel_direction.812e0b41.png\";","module.exports = __webpack_public_path__ + \"img/channel_summary.95b36627.png\";","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('NavBar'),_c('div',{staticClass:\"container-fluid\"},[_c('b-row',[_c('TOCChapter',{attrs:{\"chapter-id\":\"Chap30Concurrency\"}}),_c('b-col'),_c('b-col',{attrs:{\"role\":\"main\",\"md\":\"6\"}},[_c('ChapterHeading',{attrs:{\"chapter-title\":\"Chapter 30: Concurrency\",\"image-name\":\"concurrency.jpg\",\"image-alt\":\"Concurrency\"}}),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"what-you-will-learn-in-this-chapter\"}}),_c('h1',{attrs:{\"data-number\":\"1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"1\")]),_vm._v(\" What you will learn in this chapter ? \"),_c('a',{attrs:{\"href\":\"#what-you-will-learn-in-this-chapter\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"What is concurrency and parallelism.\")])]),_c('li',[_c('p',[_vm._v(\"What is a data race and a deadlock and how to avoid them\")])]),_c('li',[_c('p',[_vm._v(\"What is a goroutine, a channel, a select statement, a wait group, a mutex.\")])]),_c('li',[_c('p',[_vm._v(\"How to write a concurrent program with those tools.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"technical-concepts-covered\"}}),_c('h1',{attrs:{\"data-number\":\"2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"2\")]),_vm._v(\" Technical concepts covered \"),_c('a',{attrs:{\"href\":\"#technical-concepts-covered\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Mutex\")])]),_c('li',[_c('p',[_vm._v(\"Channel\")])]),_c('li',[_c('p',[_vm._v(\"Concurrency\")])]),_c('li',[_c('p',[_vm._v(\"Parallelism\")])]),_c('li',[_c('p',[_vm._v(\"Wait group\")])]),_c('li',[_c('p',[_vm._v(\"Deadlock\")])]),_c('li',[_c('p',[_vm._v(\"Data Race\")])]),_c('li',[_c('p',[_vm._v(\"Select statement\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"preliminary-definitions\"}}),_c('h1',{attrs:{\"data-number\":\"3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"3\")]),_vm._v(\" Preliminary definitions \"),_c('a',{attrs:{\"href\":\"#preliminary-definitions\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"process\"}}),_c('h2',{attrs:{\"data-number\":\"3.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"3.1\")]),_vm._v(\" Process \"),_c('a',{attrs:{\"href\":\"#process\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A process is an instance of a program that is currently executed by a computer.\")]),_c('p',[_vm._v(\"If you want to see the list of processes that run on your machine, you can open a terminal and run the following command (on UNIX systems) :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"$ ps xau\")])]),_c('p',[_vm._v(\"You will see the complete list of processes that are running on your machine. This command will output the following informations :\")]),_c('ul',[_c('li',[_c('p',[_c('strong',[_vm._v(\"USER\")]),_vm._v(\" : the user that launched the process\")])]),_c('li',[_c('p',[_c('strong',[_vm._v(\"PID\")]),_vm._v(\" : the id of the process (each process on a coputer has an unique id, therefore it makes esy to identicate one process)\")])]),_c('li',[_c('p',[_c('strong',[_vm._v(\"%CPU\")]),_vm._v(\" : Will display the percetage of the CPU usage of the process\")])]),_c('li',[_c('p',[_c('strong',[_vm._v(\"%MEM\")]),_vm._v(\" : the percentage of the memory used\")])]),_c('li',[_c('p',[_c('strong',[_vm._v(\"COMMAND\")]),_vm._v(\" : the command of the process including the arguments\")])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/ps-xau-example.png'),\"alt\":\"Example output of ps\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Example output of ps\")])],1),_c('ul',[_c('li',[_c('p',[_vm._v(\"Here we have \"),_c('strong',[_vm._v(\"two\")]),_vm._v(\" processes\")])]),_c('li',[_c('p',[_vm._v(\"They were both started with the same command \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"./programFoo\")])])])]),_c('li',[_c('p',[_vm._v(\"They have two different process ids : 65865 and 65689.\")])]),_c('li',[_c('p',[_vm._v(\"Both were launched today at 11:37 and 11:38\")])])]),_c('p',[_vm._v(\"On \"),_c('strong',[_vm._v(\"Windows\")]),_vm._v(\" you can type :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"$ tasklist\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"threads-of-execution\"}}),_c('h2',{attrs:{\"data-number\":\"3.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"3.2\")]),_vm._v(\" Threads of execution \"),_c('a',{attrs:{\"href\":\"#threads-of-execution\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A thread represents the sequential execution of a set of instructions. A single process can create \"),_c('strong',[_vm._v(\"multiple\")]),_vm._v(\" threads.\")]),_c('p',[_vm._v(\"For each process we have at least one thread of execution.\")]),_c('p',[_vm._v(\"By creating more than one thread we create multiple execution streams that may share some data.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"what-is-concurrency\"}}),_c('h2',{attrs:{\"data-number\":\"3.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"3.3\")]),_vm._v(\" What is concurrency ? \"),_c('a',{attrs:{\"href\":\"#what-is-concurrency\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"“Concurrency is the \"),_c('strong',[_vm._v(\"ability\")]),_vm._v(\" of different parts or units of a program, algorithm, or problem to be executed \"),_c('strong',[_vm._v(\"out-of-order or in partial order\")]),_vm._v(\", without affecting the final outcome”\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn1\",\"id\":\"fnref1\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"1\")])]),_vm._v(\" Concurrency refers to an \"),_c('strong',[_vm._v(\"ability\")]),_vm._v(\". Go supports concurrency. We can write a Go program that will run a set of tasks \"),_c('strong',[_vm._v(\"concurrently\")]),_vm._v(\".\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"what-is-parallelism\"}}),_c('h2',{attrs:{\"data-number\":\"3.4\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"3.4\")]),_vm._v(\" What is parallelism ? \"),_c('a',{attrs:{\"href\":\"#what-is-parallelism\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The previous notion of concurrency can be mixed up with parallelism. “Concurrency is not parallelism” (Rob Pike) \"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn2\",\"id\":\"fnref2\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"2\")])]),_vm._v(\". Parallelism refer to tasks that are executed simultaneously (at the same time). A concurrent program \"),_c('strong',[_vm._v(\"might\")]),_vm._v(\" run tasks in parallel.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"concurrency-pitfalls\"}}),_c('BuyCopyInvite'),_c('h1',{attrs:{\"data-number\":\"4\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4\")]),_vm._v(\" Concurrency pitfalls \"),_c('a',{attrs:{\"href\":\"#concurrency-pitfalls\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"data-race\"}}),_c('h2',{attrs:{\"data-number\":\"4.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.1\")]),_vm._v(\" Data race \"),_c('a',{attrs:{\"href\":\"#data-race\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"definition\"}}),_c('h3',{attrs:{\"data-number\":\"4.1.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.1.1\")]),_vm._v(\" Definition \"),_c('a',{attrs:{\"href\":\"#definition\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A data race may occur if two (or more) threads of execution access a shared variable\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"AND when one (or more) thread(s) want to update the variable\")])]),_c('li',[_c('p',[_vm._v(\"AND there is no “explicit mechanism to prevent the accesses from being simultaneous” in the threads \"),_c('b-link',{staticClass:\"citation\",attrs:{\"data-cites\":\"savage1997eraser\",\"href\":\"#savage1997eraser\"}},[_vm._v(\"[@savage1997eraser]\")]),_vm._v(\".\")],1)])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example\"}}),_c('h3',{attrs:{\"data-number\":\"4.1.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.1.2\")]),_vm._v(\" Example \"),_c('a',{attrs:{\"href\":\"#example\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Imagine that you have developed an e-commerce website that handles request concurrently.\")]),_c('p',[_vm._v(\"You have two clients at the same time that are interested by the same product : a computer screen. The current stock of the product is stored in a database.\")]),_c('table',[_c('caption',[_vm._v(\"Data race example\")]),_c('thead',[_c('tr',{staticClass:\"header\"},[_c('th',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"time\")]),_c('th',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"John\")]),_c('th',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Jeanne\")]),_c('th',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Stock in Database\")])])]),_c('tbody',[_c('tr',{staticClass:\"odd\"},[_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"0\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Load the product page\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Load the product page\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"1\")])]),_c('tr',{staticClass:\"even\"},[_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"1\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Press the order button\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Wait\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"1\")])]),_c('tr',{staticClass:\"odd\"},[_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"2\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Stock OK ? => Yes\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Press the order button\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"1\")])]),_c('tr',{staticClass:\"even\"},[_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"3\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Update the stock to 0\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Stock OK ? => Yes\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"1\")])]),_c('tr',{staticClass:\"odd\"},[_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"4\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}}),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Update the stock to 0\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"0\")])]),_c('tr',{staticClass:\"even\"},[_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"5\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}}),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Display confirmation page\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"0\")])]),_c('tr',{staticClass:\"odd\"},[_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"6\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"...\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"Display confirmation page\")]),_c('td',{staticStyle:{\"text-align\":\"center\"}},[_vm._v(\"0\")])])])]),_c('p',[_vm._v(\"Let’s take our example step by step :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"At time 0 John and Jeanne load the same product page.\")])]),_c('li',[_c('p',[_vm._v(\"At time 1 John press the order button\")])]),_c('li',[_c('p',[_vm._v(\"When John clicks on the order button our script will check the stock in database.\")])]),_c('li',[_c('p',[_vm._v(\"At that time it’s OK we have 1 in stock (see the last column) We launch the update process in database that will take two units of time.\")])]),_c('li',[_c('p',[_vm._v(\"At time 3 and 4 the product is being updated. At the the beginning of time 5 the product stock is therefore 0 in database...\")])]),_c('li',[_c('p',[_vm._v(\"But Jeanne has also pressed the order button . The update of the stock is also launched at time 4.\")])])]),_c('p',[_vm._v(\"We have sold something that we do not have in stock. This is a data race. It happened because we have two threads (John and Jeanne) that want to access in write to the same \"),_c('strong',[_vm._v(\"shared variable\")]),_vm._v(\", and we had \"),_c('strong',[_vm._v(\"no mechanism to prevent the simultaneous access\")]),_vm._v(\".…\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"data-race-detector\"}}),_c('h3',{attrs:{\"data-number\":\"4.1.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.1.3\")]),_vm._v(\" Data race detector \"),_c('a',{attrs:{\"href\":\"#data-race-detector\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"When you build and test your program you can use the Go race detector. It will detect potential errors :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"$ go build -race -o myProgramName main.go\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"deadlock\"}}),_c('h2',{attrs:{\"data-number\":\"4.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.2\")]),_vm._v(\" Deadlock \"),_c('a',{attrs:{\"href\":\"#deadlock\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"definition-1\"}}),_c('h3',{attrs:{\"data-number\":\"4.2.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.2.1\")]),_vm._v(\" Definition \"),_c('a',{attrs:{\"href\":\"#definition-1\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A deadlock occurs when two components of a program are waiting for each others. In such a case the whole system is blocked. No progress can be made in execution of the whole program.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-five-dining-philosophers\"}}),_c('h3',{attrs:{\"data-number\":\"4.2.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"4.2.2\")]),_vm._v(\" Example : five dining philosophers \"),_c('a',{attrs:{\"href\":\"#example-five-dining-philosophers\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"This problem was originally created by Edsger W. Dijkstra.\")]),_c('p',[_vm._v(\"The problem is stated as follow :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We have a round table\")])]),_c('li',[_c('p',[_vm._v(\"5 philosophers are seated.\")])]),_c('li',[_c('p',[_vm._v(\"Each philosopher has a spaghetti plate in front of them\")])]),_c('li',[_c('p',[_vm._v(\"Between each plate there is a fork placed\")])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/five_dining_philo.png'),\"alt\":\"The five dining philosophers\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"The five dining philosophers\")])],1),_c('p',[_vm._v(\"The rules of the diner are the following :\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"To eat, a guest must have two forks\")])]),_c('li',[_c('p',[_vm._v(\"A guest can only use the left and the right fork\")])])]),_c('p',[_vm._v(\"We need to design a program for each philosopher.\")]),_c('p',[_vm._v(\"A solution can be the following :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Repeat until the diner is finished:\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"When the right fork is available take it\")])]),_c('li',[_c('p',[_vm._v(\"When the left fork is available take it\")])]),_c('li',[_c('p',[_vm._v(\"When you have both forks start to eat 100 gr of spaghetti\")])]),_c('li',[_c('p',[_vm._v(\"Release the two forks\")])])])])]),_c('p',[_vm._v(\"Let’s load the program into the brain of each philosopher and start the diner. Each philosopher will be a \"),_c('strong',[_vm._v(\"thread\")]),_vm._v(\" in our main “diner” program.\")]),_c('p',[_vm._v(\"When you start the diner the following actions will be trigerred :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The philosopher 1 will take the fork I (since it’s available)\")])]),_c('li',[_c('p',[_vm._v(\"The philosopher 2 will take the fork II\")])]),_c('li',[_c('p',[_vm._v(\"The philosopher 3 will take the fork III\")])]),_c('li',[_c('p',[_vm._v(\"The philosopher 4 will take the fork IV\")])]),_c('li',[_c('p',[_vm._v(\"The philosopher 5 will take the fork V\")])])]),_c('p',[_vm._v(\"In this situation the program of each philosopher as executed the first instruction of our program :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"When the right fork is available take it\")])]),_c('p',[_vm._v(\"Then the second instruction :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"When the left fork is available take it\")])]),_c('p',[_vm._v(\"Cannot be executed because the left fork is not available. The program is blocked. It’s a Deadlock !\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"goroutines\"}}),_c('h1',{attrs:{\"data-number\":\"5\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5\")]),_vm._v(\" Goroutines \"),_c('a',{attrs:{\"href\":\"#goroutines\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The main tool to create concurrent systems in Go is the goroutine.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-main-goroutine\"}}),_c('h2',{attrs:{\"data-number\":\"5.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.1\")]),_vm._v(\" The main goroutine \"),_c('a',{attrs:{\"href\":\"#the-main-goroutine\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"In each program there is a goroutine this is the \"),_c('strong',[_vm._v(\"main goroutine\")]),_vm._v(\". In order to demonstrate it let’s build a simple program and let’s make it panic. We will see in the stacktrace (the error messages) that there is a goroutine behind it :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/main-goroutine/main.go \\npackage main\\n\\nfunc main(){\\n panic(\\\"show me the goroutine\\\")\\n}\")])]),_c('p',[_vm._v(\"Let’s build the program (go build) and launch the executable. We have the following stacktrace :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"panic: show me the goroutine\\ngoroutine 1 [running]:\\nmain.main()\")])]),_c('p',[_vm._v(\"We have a single goroutine. The main goroutine that has the index 1.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-official-definition\"}}),_c('h2',{attrs:{\"data-number\":\"5.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.2\")]),_vm._v(\" The official definition \"),_c('a',{attrs:{\"href\":\"#the-official-definition\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A goroutine is a function that executes \"),_c('strong',[_vm._v(\"independently\")]),_vm._v(\" from the rest of the program. The basic element of a goroutine is a function. Every function can become goroutines. Launching a goroutine is as simple as launching a function except that you just add the “go” word just before the function call.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-1\"}}),_c('h2',{attrs:{\"data-number\":\"5.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"5.3\")]),_vm._v(\" Example \"),_c('a',{attrs:{\"href\":\"#example-1\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"We define a function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"printNumber\")])]),_vm._v(\" :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func printNumber(){ \\n i :=0 \\n for { \\n time.Sleep(1 * time.Second) \\n i++ \\n fmt.Println(i) \\n } \\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"It begins with the initialization of a variable \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"i\")])]),_vm._v(\" at the value 0.\")])]),_c('li',[_c('p',[_vm._v(\"Then it starts an infinite loop (with the \"),_c('strong',[_vm._v(\"for\")]),_vm._v(\" instruction).\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"In this infinite loop we make the program pause for one second with \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"time.Sleep(1 * time.Second)\")])]),_c('strong',[_vm._v(\".\")])])]),_c('li',[_c('p',[_vm._v(\"After that we increment \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"i\")])]),_vm._v(\" (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"i++\")])]),_vm._v(\")\")])]),_c('li',[_c('p',[_vm._v(\"and then we print \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"i\")])])])])])])]),_c('p',[_vm._v(\"After that we declare our main function (the main goroutine) :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func main(){ \\n fmt.Println(\\\"launch goroutine\\\") \\n go printNumber() \\n fmt.Println(\\\"launch goroutine\\\") \\n go printNumber() \\n time.Sleep(1 * time.Minute) \\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"In this program we launch 2 goroutines sequentially.\")])]),_c('li',[_c('p',[_vm._v(\"At the end we pause the program 1 minute.\")])])]),_c('p',[_vm._v(\"Why this last pause ? When you do not add the pause the program will just stop right after it’s execution because the thread of execution has reached the end of the main function. If we want to see our goroutine execute we have to wait them to be launched. \"),_c('strong',[_vm._v(\"Launching a goroutine does not block the main thread.\")])]),_c('p',[_vm._v(\"Here is the complete program :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/goroutine-example/main.go \\npackage main\\n\\nimport ( \\n \\\"fmt\\\" \\n \\\"time\\\" \\n)\\n\\nfunc main(){ \\n fmt.Println(\\\"launch first goroutine\\\") \\n go printNumber() \\n fmt.Println(\\\"launch second goroutine\\\") \\n go printNumber() \\n time.Sleep(1 * time.Minute) \\n}\\n\\nfunc printNumber(){ \\n i :=0 \\n for { \\n time.Sleep(1 * time.Second) \\n i++ \\n fmt.Println(i) \\n } \\n}\")])]),_c('p',[_vm._v(\"The execution of this program will output the following :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"launch first goroutine \\nlaunch second goroutine \\n1 \\n1 \\n2 \\n2 \\n3 \\n3 \\n4 \\n4\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"channels\"}}),_c('h1',{attrs:{\"data-number\":\"6\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6\")]),_vm._v(\" Channels \"),_c('a',{attrs:{\"href\":\"#channels\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"a-channel-is-a-typed-communication-pipeline.\"}}),_c('h2',{attrs:{\"data-number\":\"6.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.1\")]),_vm._v(\" A channel is a typed communication pipeline. \"),_c('a',{attrs:{\"href\":\"#a-channel-is-a-typed-communication-pipeline.\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Goroutines can communicate with each others through channels. A channel can be seen as a pipeline of data between two goroutines. This pipeline can only support \"),_c('strong',[_vm._v(\"a specific type.\")])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/channel_communication_between_goroutines.png'),\"alt\":\"Channels allow communication between goroutines\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Channels allow communication between goroutines\")])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"channel-types\"}}),_c('h2',{attrs:{\"data-number\":\"6.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.2\")]),_vm._v(\" Channel types \"),_c('a',{attrs:{\"href\":\"#channel-types\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Channels can be :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Send Only\")])]),_c('li',[_c('p',[_vm._v(\"Receive only\")])]),_c('li',[_c('p',[_vm._v(\"Bidirectional (it can send or receive)\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"syntax\"}}),_c('h4',{attrs:{\"data-number\":\"6.2.0.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.2.0.1\")]),_vm._v(\" Syntax \"),_c('a',{attrs:{\"href\":\"#syntax\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"A channel that can can be used to \"),_c('strong',[_vm._v(\"send\")]),_vm._v(\" values of type T is denoted : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"chan<- T\")])])])]),_c('li',[_c('p',[_vm._v(\"A channel that can can be used to \"),_c('strong',[_vm._v(\"receive\")]),_vm._v(\" values of type T is denoted : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"<-chan T\")])])])]),_c('li',[_c('p',[_vm._v(\"A channel that can can be used to send and \"),_c('strong',[_vm._v(\"receive\")]),_vm._v(\" values of type T is denoted : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"chan T\")])])])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/channel_direction.png'),\"alt\":\"Channel direction\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Channel direction\")])],1),_c('p',[_vm._v(\"The zero value of a channel type is \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"nil\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"channel-initialization-capacity\"}}),_c('h2',{attrs:{\"data-number\":\"6.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.3\")]),_vm._v(\" Channel initialization, capacity \"),_c('a',{attrs:{\"href\":\"#channel-initialization-capacity\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Channels are initialized with the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"make\")])]),_vm._v(\" built-in :\")]),_c('p',[_vm._v(\"In order to \"),_c('strong',[_vm._v(\"initialize\")]),_vm._v(\" a bidirectional \"),_c('strong',[_vm._v(\"unbuffered\")]),_vm._v(\" channel of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"int\")])]),_vm._v(\" you can use the following code :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ch1 := make(chan int)\")])]),_c('p',[_vm._v(\"In order to \"),_c('strong',[_vm._v(\"initialize\")]),_vm._v(\" a bidirectional \"),_c('strong',[_vm._v(\"buffered\")]),_vm._v(\" channel of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"string\")])]),_vm._v(\" you can use the following code :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ch2 := make(chan string, 3)\")])]),_c('p',[_vm._v(\"3 is the \"),_c('strong',[_vm._v(\"capacity\")]),_vm._v(\" of the channel. This is the space allocated by Go to store the values sent to the channel.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"unbuffered-channel\"}}),_c('h3',{attrs:{\"data-number\":\"6.3.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.3.1\")]),_vm._v(\" Unbuffered channel \"),_c('a',{attrs:{\"href\":\"#unbuffered-channel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A channel is \"),_c('strong',[_vm._v(\"un\")]),_vm._v(\"buffered when you do not specify it’s capacity when you create it. A channel with a size of zero is also \"),_c('strong',[_vm._v(\"un\")]),_vm._v(\"buffered.\")]),_c('p',[_vm._v(\"To create an unbuffered channel you can use the following code source :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ch3 := make(chan float)\")])]),_c('p',[_vm._v(\"Or by specifying explicitely a size of 0 (which is equivalent to the previous notation) :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ch4 := make(chan float, 0)\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"buffered-channels\"}}),_c('h3',{attrs:{\"data-number\":\"6.3.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.3.2\")]),_vm._v(\" Buffered channels \"),_c('a',{attrs:{\"href\":\"#buffered-channels\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A buffered channel is a channel where you specify the buffer size when you create it.\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"ch6 := make(chan float, 16)\")])]),_c('p',[_vm._v(\"Here we have created a buffered channel with capacity of 16.\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/channel_unbuffered_buffered.png'),\"alt\":\"Buffered and Unbuffered channels\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Buffered and Unbuffered channels\")])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"send-data-on-a-channel\"}}),_c('h2',{attrs:{\"data-number\":\"6.4\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.4\")]),_vm._v(\" Send data on a channel \"),_c('a',{attrs:{\"href\":\"#send-data-on-a-channel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Let’s say that we have a channel called \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch5\")])]),_vm._v(\". To send an element to this channel we will use the arrow syntax : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"<-\")])]),_c('strong',[_vm._v(\".\")])]),_c('p',[_vm._v(\"Those two characters convey the idea of data that flows \"),_c('strong',[_vm._v(\"from the right to the left.\")])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"package main\\n\\nfunc main() {\\n ch5 := make(chan int, 2)\\n ch5 <- 42\\n}\")])]),_c('p',[_vm._v(\"In the previous snippet :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We initialize a bidirectional buffered channel of integers (\"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch5\")])]),_vm._v(\")\")])]),_c('li',[_c('p',[_vm._v(\"Then we \"),_c('strong',[_vm._v(\"send\")]),_vm._v(\" the number 42 into the channel with the syntax :\")]),_c('ul',[_c('li',[_vm._v(\"channel <- expression\")])])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-specificity-of-a-send-statement\"}}),_c('h3',{attrs:{\"data-number\":\"6.4.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.4.1\")]),_vm._v(\" The specificity of a send statement \"),_c('a',{attrs:{\"href\":\"#the-specificity-of-a-send-statement\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Send statements have some specific rules :\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"The channel and the expression are evaluated before communication\")])]),_c('li',[_c('p',[_vm._v(\"You can send on a channel if it’s open. If you send on a closed channel your program will panic !\")])]),_c('li',[_c('p',[_vm._v(\"If you send on a nil channel it blocks your program forever\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"closing-a-channel\"}}),_c('h2',{attrs:{\"data-number\":\"6.5\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.5\")]),_vm._v(\" Closing a channel \"),_c('a',{attrs:{\"href\":\"#closing-a-channel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A channel can be closed with the built-in \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"close\")])]),_vm._v(\". Closing a channel indicate that “no more values will be sent on the channel”\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn3\",\"id\":\"fnref3\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"3\")])]),_vm._v(\".\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"You cannot close a receive only channel.\")])]),_c('li',[_c('p',[_vm._v(\"You cannot send data on a closed channel.\")])]),_c('li',[_c('p',[_vm._v(\"You cannot close a channel already closed.\")])]),_c('li',[_c('p',[_vm._v(\"You can receive data on a closed channel (see next section)\")])])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"package main\\n\\nimport \\\"log\\\"\\n\\nfunc main() {\\n var received int\\n ch5 := make(chan int, 2)\\n ch5 <- 42\\n close(ch5)\\n}\")])]),_c('p',[_vm._v(\"Here we send the value 42 into the channel, then we close it with the close built-in : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"close(ch5)\")])]),_vm._v(\".\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"receive-data-from-a-channel\"}}),_c('h2',{attrs:{\"data-number\":\"6.6\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.6\")]),_vm._v(\" Receive data from a channel \"),_c('a',{attrs:{\"href\":\"#receive-data-from-a-channel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"In order to receive something from a channel you can use two types of syntax\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"the-basic-receive-operation\"}}),_c('h3',{attrs:{\"data-number\":\"6.6.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.6.1\")]),_vm._v(\" The basic receive operation \"),_c('a',{attrs:{\"href\":\"#the-basic-receive-operation\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"package main\\n\\nimport \\\"log\\\"\\n\\nfunc main() {\\n var received int\\n ch5 := make(chan int, 2)\\n ch5 <- 42\\n ch5 <- 41\\n received = <-ch5\\n log.Println(received)\\n}\")])]),_c('p',[_vm._v(\"In this code snippet:\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We create a buffered channel of integers : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch5\")])])])]),_c('li',[_c('p',[_vm._v(\"We send the values 42 and 41 into the channel\")])]),_c('li',[_c('p',[_vm._v(\"We set the value of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"received\")])]),_vm._v(\" to \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"<-ch5\")])])])]),_c('li',[_c('p',[_vm._v(\"We print the value of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"received\")])])])])]),_c('p',[_vm._v(\"The previous script will output : \"),_c('strong',[_vm._v(\"42.\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"multi-valued-receive-operation\"}}),_c('h3',{attrs:{\"data-number\":\"6.6.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.6.2\")]),_vm._v(\" Multi-valued receive operation \"),_c('a',{attrs:{\"href\":\"#multi-valued-receive-operation\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"This syntax is used in order to be sure that our channel is not closed or empty. (source : \"),_c('b-link',{staticClass:\"citation\",attrs:{\"data-cites\":\"go-specs\",\"href\":\"#go-specs\"}},[_vm._v(\"[@go-specs]\")]),_vm._v(\")\")],1),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"x, ok = <-ch \\nif !ok {\\n log.Println(\\\"channel is empty or closed\\\")\\n}\")])]),_c('p',[_vm._v(\"In this example we have the variable \"),_c('strong',[_vm._v(\"x\")]),_vm._v(\" that will hold the value of what is sent in the channel but we add an \"),_c('strong',[_vm._v(\"ok\")]),_vm._v(\" variable that will help us determine if the channel is empty or closed.\")]),_c('p',[_vm._v(\"The value of \"),_c('strong',[_vm._v(\"ok\")]),_vm._v(\" is a boolean and will be equal to :\")]),_c('ul',[_c('li',[_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"true\")])]),_vm._v(\" : is everything is ok, we received a value. (nominal case)\")])]),_c('li',[_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"false\")])]),_vm._v(\" : if the channel is \"),_c('strong',[_vm._v(\"empty\")]),_vm._v(\" or \"),_c('strong',[_vm._v(\"closed\")]),_vm._v(\".\")])])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"package main\\n\\nimport \\\"fmt\\\"\\n\\nfunc main() {\\n ch5 := make(chan int, 2)\\n ch5 <- 42\\n close(ch5)\\n received, ok := <-ch5\\n fmt.Println(received, ok)\\n}\")])]),_c('p',[_vm._v(\"This program will output :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"42 true\")])]),_c('p',[_vm._v(\"The channel is closed so ok is true and we still received a value from the channel 42 (was sent before closing)\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"syntax-summary\"}}),_c('h2',{attrs:{\"data-number\":\"6.7\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.7\")]),_vm._v(\" Syntax summary \"),_c('a',{attrs:{\"href\":\"#syntax-summary\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/channel_summary.png'),\"alt\":\"Init, receive, send and close\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Init, receive, send and close\")])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"how-to-remember-the-syntax-easily\"}}),_c('h2',{attrs:{\"data-number\":\"6.8\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.8\")]),_vm._v(\" How to remember the syntax easily ? \"),_c('a',{attrs:{\"href\":\"#how-to-remember-the-syntax-easily\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"When the arrow \"),_c('strong',[_vm._v(\"points to the channel\")]),_vm._v(\" we \"),_c('strong',[_vm._v(\"send\")]),_vm._v(\" data \"),_c('strong',[_vm._v(\"into\")]),_vm._v(\" the channel\")])]),_c('li',[_c('p',[_vm._v(\"Otherwise we receive data from the channel\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"channel-capacity-and-send-operations\"}}),_c('h2',{attrs:{\"data-number\":\"6.9\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.9\")]),_vm._v(\" Channel capacity and send operations \"),_c('a',{attrs:{\"href\":\"#channel-capacity-and-send-operations\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"unbuffered-channel-capacity-0\"}}),_c('h3',{attrs:{\"data-number\":\"6.9.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.9.1\")]),_vm._v(\" Unbuffered channel (capacity = 0) \"),_c('a',{attrs:{\"href\":\"#unbuffered-channel-capacity-0\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_vm._v(\"When you send data into an unbuffered channel your current goroutine \"),_c('strong',[_vm._v(\"will be blocked until the data is received\")]),_vm._v(\" by another goroutine.\")])]),_c('p',[_vm._v(\"There is no buffer allocated to store the message sent, as a consequence the sender blocks until another goroutine receive the message.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-2\"}}),_c('h4',{attrs:{\"data-number\":\"6.9.1.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.9.1.1\")]),_vm._v(\" Example \"),_c('a',{attrs:{\"href\":\"#example-2\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/channel-capacity-send/main.go \\npackage main\\n\\nimport (\\n \\\"log\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n ch := make(chan int)\\n go dummy(ch)\\n log.Println(\\\"waiting for reception...\\\")\\n ch <- 45\\n log.Println(\\\"received\\\")\\n}\\n\\nfunc dummy(c chan int) {\\n time.Sleep(3 * time.Second)\\n <-c\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We create an unbuffered channel of integers \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch\")])])])]),_c('li',[_c('p',[_vm._v(\"A second goroutine is launched with \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"go dummy(ch)\")])])])]),_c('li',[_c('p',[_vm._v(\"The goroutine will wait 3 seconds then receive data on the input channel.\")]),_c('ul',[_c('li',[_vm._v(\"The data is received is discarded (we do not store it into a variable)\")])])]),_c('li',[_c('p',[_vm._v(\"In the main goroutine we send the value 45 into the channel.\")])])]),_c('p',[_vm._v(\"This program outputs\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2021/02/15 21:53:27 waiting for reception...\\n2021/02/15 21:53:30 received\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The send operation blocks the main goroutine\")])]),_c('li',[_c('p',[_vm._v(\"It is unblocked when the dummy goroutine receive the value sent\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"buffered-channel-capacity-0\"}}),_c('h3',{attrs:{\"data-number\":\"6.9.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.9.2\")]),_vm._v(\" Buffered channel (capacity > 0) \"),_c('a',{attrs:{\"href\":\"#buffered-channel-capacity-0\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_vm._v(\"When you send data into an buffered channel your current goroutine \"),_c('strong',[_vm._v(\"will be blocked until the data is copied to the buffer\")]),_vm._v(\".\")])]),_c('p',[_vm._v(\"A buffered channel has a buffer allocated. Therefore the sender needs only to wait until the data has been efectively copied to the internal buffer.\")]),_c('p',[_vm._v(\"Let’s take the previous program and add a capacity to the channel :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/channel-capacity-send-buffered/main.go \\npackage main\\n\\nimport (\\n \\\"log\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n ch := make(chan int, 1)\\n go dummy(ch)\\n log.Println(\\\"waiting for reception...\\\")\\n ch <- 45\\n log.Println(\\\"received\\\")\\n}\\n\\nfunc dummy(c chan int) {\\n time.Sleep(3 * time.Second)\\n <-c\\n}\")])]),_c('p',[_vm._v(\"The program output is :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2021/02/15 21:56:05 waiting for reception...\\n2021/02/15 21:56:05 received\")])]),_c('p',[_vm._v(\"You can note that the send operation is not blocking. 45 is written to the channel buffen and then the next line of code is executed.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"channel-capacity-and-receive-operations\"}}),_c('h2',{attrs:{\"data-number\":\"6.10\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.10\")]),_vm._v(\" Channel capacity and receive operations \"),_c('a',{attrs:{\"href\":\"#channel-capacity-and-receive-operations\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"For buffered and unbuffered channels a receive operation blocks the goroutine until a message is received.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"len-cap\"}}),_c('h2',{attrs:{\"data-number\":\"6.11\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.11\")]),_vm._v(\" Len / cap \"),_c('a',{attrs:{\"href\":\"#len-cap\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The builtin \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"len\")])]),_vm._v(\" will return the number of elements queued into the channel buffer\")])]),_c('li',[_c('p',[_vm._v(\"The builtin \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"cap\")])]),_vm._v(\" will return the buffer capacity\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"summary\"}}),_c('h2',{attrs:{\"data-number\":\"6.12\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.12\")]),_vm._v(\" Summary \"),_c('a',{attrs:{\"href\":\"#summary\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('table',{staticStyle:{\"width\":\"96%\"}},[_c('caption',[_vm._v(\"Buffered vs unbuffered channel\")]),_c('colgroup',[_c('col',{staticStyle:{\"width\":\"31%\"}}),_c('col',{staticStyle:{\"width\":\"31%\"}}),_c('col',{staticStyle:{\"width\":\"31%\"}})]),_c('thead',[_c('tr',{staticClass:\"header\"},[_c('th',{staticStyle:{\"text-align\":\"left\"}}),_c('th',{staticStyle:{\"text-align\":\"left\"}},[_c('strong',[_vm._v(\"Unbuffered channel\")])]),_c('th',{staticStyle:{\"text-align\":\"left\"}},[_c('strong',[_vm._v(\"Buffered channel\")])])])]),_c('tbody',[_c('tr',{staticClass:\"odd\"},[_c('td',{staticStyle:{\"text-align\":\"left\"}},[_vm._v(\"Init.\")]),_c('td',{staticStyle:{\"text-align\":\"left\"}},[_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"make(chan float)\")])])]),_c('td',{staticStyle:{\"text-align\":\"left\"}},[_vm._v(\"make(chan float, 16)\")])]),_c('tr',{staticClass:\"even\"},[_c('td',{staticStyle:{\"text-align\":\"left\"}},[_vm._v(\"Send is blocking..\")]),_c('td',{staticStyle:{\"text-align\":\"left\"}},[_vm._v(\"until the recipient has received the value\")]),_c('td',{staticStyle:{\"text-align\":\"left\"}},[_vm._v(\"until the data is copied to the buffer\")])]),_c('tr',{staticClass:\"odd\"},[_c('td',{staticStyle:{\"text-align\":\"left\"}},[_vm._v(\"Receive is blocking...\")]),_c('td',{staticStyle:{\"text-align\":\"left\"}}),_c('td',{staticStyle:{\"text-align\":\"left\"}})])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"use-case-of-channels\"}}),_c('h2',{attrs:{\"data-number\":\"6.13\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.13\")]),_vm._v(\" Use case of channels \"),_c('a',{attrs:{\"href\":\"#use-case-of-channels\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_vm._v(\"Unbuffered channels are used to \"),_c('strong',[_vm._v(\"synchronize two goroutines\")])])]),_c('p',[_vm._v(\"Here is an example\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn4\",\"id\":\"fnref4\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"4\")])]),_vm._v(\" :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/channel-usecase/main.go\\npackage main\\n\\nimport (\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n syncCh := make(chan bool)\\n // launch a second goroutine\\n go func() {\\n longTask2()\\n // finished\\n syncCh <- true\\n }()\\n longTask()\\n // blocks until the second goroutine has finished\\n <-syncCh\\n}\\n\\nfunc longTask2() {\\n time.Sleep(1 * time.Second)\\n}\\n\\nfunc longTask() {\\n time.Sleep(3 * time.Second)\\n}\")])]),_c('p',[_vm._v(\"The unbuffered channel is used here to synchronize the main goroutine with the secong goroutine. The receive operation \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"<-syncCh\")])]),_vm._v(\" is blocking until the other goroutine has finished. To signal that it has finished the second goroutine will send the value “true” in the channel.\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Buffered channels are used to limit \"),_c('strong',[_vm._v(\"limit throughput\")]),_vm._v(\" between goroutines\")]),_c('ul',[_c('li',[_vm._v(\"We will see how it works in the application.\")])])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"how-to-cause-a-deadlock\"}}),_c('h2',{attrs:{\"data-number\":\"6.14\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.14\")]),_vm._v(\" How to cause a deadlock \"),_c('a',{attrs:{\"href\":\"#how-to-cause-a-deadlock\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"with-a-buffered-channel\"}}),_c('h4',{attrs:{\"data-number\":\"6.14.0.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.14.0.1\")]),_vm._v(\" With a buffered channel \"),_c('a',{attrs:{\"href\":\"#with-a-buffered-channel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/deadlock/main.go\\npackage main\\n\\nimport (\\n \\\"log\\\"\\n)\\n\\nfunc main() {\\n ch := make(chan int, 1)\\n go dummy(ch)\\n log.Println(\\\"waiting for reception...\\\")\\n ch <- 45\\n ch <- 58\\n ch <- 100\\n}\\n\\nfunc dummy(c chan int) {\\n smth := <-c\\n log.Println(\\\"has received something\\\", smth)\\n}\")])]),_c('p',[_vm._v(\"This code will cause a dedlock. Here is the execution result :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2021/02/16 11:19:57 waiting for reception...\\n2021/02/16 11:19:57 has received something 45\\nfatal error: all goroutines are asleep - deadlock!\\n\\ngoroutine 1 [chan send]:\\nmain.main()\\n /Users/maximilienandile/Documents/DEV/goBook/concurrency/sendBlocking/main.go:15 +0xea\\n\\nProcess finished with exit code 2\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We have created an buffered channel with a capacity equal to 1\")])]),_c('li',[_c('p',[_vm._v(\"This channel is passed to a new goroutine that will \"),_c('strong',[_vm._v(\"receive\")]),_vm._v(\" data on the channel (the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"dummy\")])]),_vm._v(\" function).\")])]),_c('li',[_c('p',[_vm._v(\"We send three values on the channel : 45, 58 and 100.\")])]),_c('li',[_c('p',[_vm._v(\"The first value is received by the dummy goroutine.\")]),_c('ul',[_c('li',[_vm._v(\"There is room on the buffer to store the second value\")])])]),_c('li',[_c('p',[_vm._v(\"When we send the third value on the channel the main goroutine will be blocked\")]),_c('ul',[_c('li',[_vm._v(\"It is blocked until the third value is copied to the channel buffer\")])])]),_c('li',[_c('p',[_vm._v(\"The program will wait indefinitely.\")])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/deadluck_unbuffered.png'),\"alt\":\"An example deadlock with an buffered channel\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"An example deadlock with an buffered channel\")])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"with-an-unbuffered-channel\"}}),_c('h4',{attrs:{\"data-number\":\"6.14.0.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"6.14.0.2\")]),_vm._v(\" With an unbuffered channel \"),_c('a',{attrs:{\"href\":\"#with-an-unbuffered-channel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/deadlock-unbuffered/main.go\\npackage main\\n\\nfunc main() {\\n ch := make(chan int)\\n ch <- 5\\n}\")])]),_c('p',[_vm._v(\"This simple program will cause a deadlock. The main goroutine is waiting indefinitely until a receipient receive the data sent.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"select-statement\"}}),_c('h1',{attrs:{\"data-number\":\"7\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"7\")]),_vm._v(\" Select statement \"),_c('a',{attrs:{\"href\":\"#select-statement\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Select statements are used to choose “which of a set of possible send or receive operations will proceed”\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn5\",\"id\":\"fnref5\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"5\")])]),_vm._v(\".\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"A select statement is similar to a \"),_c('strong',[_vm._v(\"switch case\")]),_vm._v(\" statement but for communication operations.\")])]),_c('li',[_c('p',[_vm._v(\"In a select statement you have \"),_c('strong',[_vm._v(\"cases\")]),_vm._v(\" and an \"),_c('strong',[_vm._v(\"optional\")]),_vm._v(\" \"),_c('strong',[_vm._v(\"default\")]),_vm._v(\" case.\")])]),_c('li',[_c('p',[_vm._v(\"The first non-blocking case will be chosen\")])]),_c('li',[_c('p',[_vm._v(\"If \"),_c('strong',[_vm._v(\"2 or more\")]),_vm._v(\" cases are not blocking \"),_c('strong',[_vm._v(\"a single one is chosen\")]),_vm._v(\" via an “uniform pseudo-random” selection.\")])]),_c('li',[_c('p',[_vm._v(\"If all cases are blocking, then the default case is chosen\")])])]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/select_statement_syntax.png'),\"alt\":\"Select Statement syntax\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Select Statement syntax\")])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"without-default\"}}),_c('h2',{attrs:{\"data-number\":\"7.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"7.1\")]),_vm._v(\" Without Default \"),_c('a',{attrs:{\"href\":\"#without-default\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/select-without-default/main.go\\npackage main\\n\\nimport \\\"log\\\"\\n\\nfunc main() {\\n\\n ch1 := make(chan string, 1)\\n ch2 := make(chan string, 1)\\n ch1 <- \\\"test\\\"\\n\\n select {\\n case rec, ok := <-ch1:\\n if ok {\\n log.Printf(\\\"received on ch1 : %s\\\", rec)\\n }\\n case rec, ok := <-ch2:\\n if ok {\\n log.Printf(\\\"received on ch2 : %s\\\", rec)\\n }\\n }\\n log.Println(\\\"end\\\")\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We have a select statement with 2 receive operations.\")])]),_c('li',[_c('p',[_vm._v(\"We are waiting for reception on \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch1\")])]),_vm._v(\" and \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch2\")])]),_vm._v(\".\")])]),_c('li',[_c('p',[_vm._v(\"The first non blocking case is chosen => here the first case \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"case rec, ok := <-ch1:\")])])])])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch1\")])]),_vm._v(\" is the first channel to receive a message. Here is the output of this program :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2021/02/16 17:05:27 received on ch1 : test\\n2021/02/16 17:05:27 end\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"default\"}}),_c('h2',{attrs:{\"data-number\":\"7.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"7.2\")]),_vm._v(\" Default \"),_c('a',{attrs:{\"href\":\"#default\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/select-with-default/main.go\\npackage main\\n\\nimport \\\"log\\\"\\n\\nfunc main() {\\n\\n ch1 := make(chan string, 1)\\n ch2 := make(chan string, 1)\\n select {\\n case rec, ok := <-ch1:\\n if ok {\\n log.Printf(\\\"received on ch1 : %s\\\", rec)\\n }\\n case rec, ok := <-ch2:\\n if ok {\\n log.Printf(\\\"received on ch2 : %s\\\", rec)\\n }\\n default:\\n log.Println(\\\"default case\\\")\\n }\\n log.Println(\\\"end\\\")\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"default\")])]),_vm._v(\" case is chosen\")])]),_c('li',[_c('p',[_vm._v(\"Nothing has been sent on the two channels\")])]),_c('li',[_c('p',[_vm._v(\"The two cases of the select statement are blocking, the communication operations cannot proceed.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"empty-select-statement\"}}),_c('h2',{attrs:{\"data-number\":\"7.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"7.3\")]),_vm._v(\" Empty select statement \"),_c('a',{attrs:{\"href\":\"#empty-select-statement\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"An empty select statement blocks the goroutine indefinitively.\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"package main\\n\\nfunc main() {\\n select {}\\n}\")])]),_c('p',[_vm._v(\"This program will cause a deadlock.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"some-common-use-cases-of-channels-and-selects\"}}),_c('BuyCopyInvite'),_c('h1',{attrs:{\"data-number\":\"8\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"8\")]),_vm._v(\" Some common use cases of channels and selects \"),_c('a',{attrs:{\"href\":\"#some-common-use-cases-of-channels-and-selects\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"I will detail in this section some common use cases of channel and selects that I find interesting.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"graceful-shutdown-of-an-http-server\"}}),_c('h2',{attrs:{\"data-number\":\"8.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"8.1\")]),_vm._v(\" Graceful shutdown of an HTTP server \"),_c('a',{attrs:{\"href\":\"#graceful-shutdown-of-an-http-server\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A program has the ability to stop in a clean and ordened way if it implements a “graceful shutdown” mechanism.\")]),_c('p',[_vm._v(\"This mechanism has to detect that the program has been interrupted. The \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"os/signal\")])]),_vm._v(\" package has a dedicated function called \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Notify\")])]),_vm._v(\" that can detect OS signals such as an “interrupt”.\")]),_c('p',[_vm._v(\"After detection of such a signal the program needs to implement a specific shutdown logic (save some state, delete some temporary objects, close some connections ...)\")]),_c('p',[_vm._v(\"In this section we will take the example of an HTTP server :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/server-graceful-shutdown/main.go\\npackage main\\n\\nimport (\\n \\\"context\\\"\\n \\\"fmt\\\"\\n \\\"log\\\"\\n \\\"net/http\\\"\\n \\\"os\\\"\\n \\\"os/signal\\\"\\n \\\"syscall\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n // create the notification channel\\n bye := make(chan os.Signal)\\n signal.Notify(bye, os.Interrupt, syscall.SIGTERM)\\n\\n mux := http.NewServeMux()\\n mux.Handle(\\\"/status\\\", http.HandlerFunc(\\n func(w http.ResponseWriter, r *http.Request) {\\n fmt.Fprintf(w, \\\"OK\\\")\\n },\\n ))\\n srv := &http.Server{\\n Addr: \\\":8081\\\",\\n Handler: mux,\\n }\\n // launch the server in another goroutine\\n go func() {\\n // launch the server\\n err := srv.ListenAndServe()\\n if err != nil && err != http.ErrServerClosed {\\n log.Fatalf(\\\"server: %q\\\\n\\\", err)\\n }\\n }()\\n // wait for os signal\\n sig := <-bye\\n // the code below is executed when we receive an os.Signal\\n log.Printf(\\\"detected os signal %s \\\\n\\\", sig)\\n ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)\\n err := srv.Shutdown(ctx)\\n cancel()\\n if err != nil {\\n log.Fatal(err)\\n }\\n}\")])]),_c('ul',[_c('li',[_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"signal.Notify\")])]),_vm._v(\" will use the channel \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"bye\")])]),_vm._v(\" to notify to our program when the program receive :\")])]),_c('li',[_c('p',[_vm._v(\"an interruption signal \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"os.Interrupt\")])])]),_c('ul',[_c('li',[_vm._v(\"a SIGTERM signal \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"os.SIGTERM\")])])])])]),_c('li',[_c('p',[_vm._v(\"A classical server with one route \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"\\\"/status\\\"\")])]),_vm._v(\" is created.\")])]),_c('li',[_c('p',[_vm._v(\"The server is launched into a new goroutine\")])]),_c('li',[_c('p',[_vm._v(\"On the main goroutine we wait for a potential os signal with \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"sig := <-bye\")])])])]),_c('li',[_c('p',[_vm._v(\"Once the signal has been received we execute this code :\")])])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"log.Printf(\\\"detected os signal %s \\\\n\\\", sig)\\nerr := srv.Shutdown(context.Background())\\nif err != nil {\\n log.Fatal(err)\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We call \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"srv.Shutdown\")])]),_vm._v(\" which will gracefully shuts down the server.\")])]),_c('li',[_c('p',[_vm._v(\"It will “first close all open listeners, then close all idle connections, and then wait indefinitely for connections to return to idle and then shut down” \"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn6\",\"id\":\"fnref6\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"6\")])])])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"timeout\"}}),_c('h2',{attrs:{\"data-number\":\"8.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"8.2\")]),_vm._v(\" Timeout \"),_c('a',{attrs:{\"href\":\"#timeout\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A timeout is an amount of time that is allowed before an event takes place. It can be interesting to implement a timeout when your program rely on external resources that might become unavailable. Without a timeout your program might wailt indefinitely for the resource.\")]),_c('p',[_vm._v(\"With a select statement we can add a timeout case :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/timeout/main.go\\npackage main\\n\\nimport (\\n \\\"log\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n ch := make(chan int, 1)\\n select {\\n case rec, ok := <-ch:\\n if ok {\\n log.Printf(\\\"received %d\\\", rec)\\n }\\n case rec, ok := <-time.After(time.Second * 3):\\n if ok {\\n log.Printf(\\\"operation timed out at %s\\\", rec)\\n }\\n }\\n}\")])]),_c('ul',[_c('li',[_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"time.After\")])]),_vm._v(\" returns a receive only channel of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"time.Time\")])]),_vm._v(\" elements\")])]),_c('li',[_c('p',[_vm._v(\"After 3 seconds the timeout occurs\")])])]),_c('p',[_vm._v(\"The program output is :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"2021/02/16 17:44:12 operation timed out at 2021-02-16 17:44:12.316518 +0100 CET m=+3.00403174\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"wait-groups\"}}),_c('h1',{attrs:{\"data-number\":\"9\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"9\")]),_vm._v(\" Wait groups \"),_c('a',{attrs:{\"href\":\"#wait-groups\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A wait group is a synchronization tool provided by the standard library. It can be used to wait for a group of goroutines to finish their tasks.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-3\"}}),_c('h2',{attrs:{\"data-number\":\"9.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"9.1\")]),_vm._v(\" Example \"),_c('a',{attrs:{\"href\":\"#example-3\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/wait-group-without/main.go\\npackage main\\n\\nimport (\\n \\\"fmt\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n fmt.Printf(\\\"Program start \\\\n\\\")\\n for i := 0; i < 10; i++ {\\n go concurrentTaks(i)\\n }\\n finishTask()\\n fmt.Printf(\\\"Program end \\\\n\\\")\\n\\n}\\n\\nfunc finishTask() {\\n fmt.Println(\\\"Executing finish task\\\")\\n}\\n\\nfunc concurrentTaks(taskNumber int) {\\n fmt.Printf(\\\"BEGIN Execute task number %d \\\\n\\\", taskNumber)\\n time.Sleep(100 * time.Millisecond)\\n fmt.Printf(\\\"END Execute task number %d \\\\n\\\", taskNumber)\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We will launch 10 goroutines that will call the function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"concurrentTaks(i)\")])]),_vm._v(\" where \"),_c('strong',[_vm._v(\"i\")]),_vm._v(\" is the index of the loop counter.\")])]),_c('li',[_c('p',[_vm._v(\"After launching those goroutines we will call a function \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"finishTask\")])])])])]),_c('p',[_vm._v(\"The previous program will output :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"Program start\\nExecuting finish task\\nProgram end\")])]),_c('p',[_vm._v(\"It seems that we are not even launching our goroutines ! Why ? Thats because launching a goroutine does not block the main goroutine .…\")]),_c('p',[_vm._v(\"We can modify our source code to add a wait group :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/wait-group/main.go\\npackage main\\n\\nimport (\\n \\\"fmt\\\"\\n \\\"sync\\\"\\n \\\"time\\\"\\n)\\n\\nfunc main() {\\n fmt.Printf(\\\"Program start \\\\n\\\")\\n // initialize the wait group\\n var waitGroup sync.WaitGroup\\n waitGroup.Add(10)\\n for i := 0; i < 10; i++ {\\n go concurrentTaks(i, &waitGroup)\\n }\\n waitGroup.Wait()\\n finishTask()\\n fmt.Printf(\\\"Program end \\\\n\\\")\\n\\n}\\n\\nfunc finishTask() {\\n fmt.Println(\\\"Executing finish task\\\")\\n}\\n\\nfunc concurrentTaks(taskNumber int, waitGroup *sync.WaitGroup) {\\n fmt.Printf(\\\"BEGIN Execute task number %d \\\\n\\\", taskNumber)\\n time.Sleep(100 * time.Millisecond)\\n fmt.Printf(\\\"END Execute task number %d \\\\n\\\", taskNumber)\\n waitGroup.Done()\\n}\")])]),_c('p',[_vm._v(\"This code snippet will output the following :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"Program start\\nBEGIN Execute task number 3\\nBEGIN Execute task number 9\\nBEGIN Execute task number 7\\n...\\nEND Execute task number 9\\nEND Execute task number 7\\nEND Execute task number 3\\nExecuting finish task\\nProgram end\")])]),_c('p',[_vm._v(\"We have the expected result. Our goroutines have executed. Let’s see what have changed.…\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"At the beginning of the program we have created a variable of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"sync.WaitGroup\")])])])]),_c('li',[_c('p',[_vm._v(\"We indicate to the wait group that he needs to wait for 10 units of work to be done.\")])]),_c('li',[_c('p',[_vm._v(\"The internal counter of the wait group will be incremented.\")])]),_c('li',[_c('p',[_vm._v(\"Then we pass the a pointer to the wait group to our goroutines.\")])])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"go concurrentTaks(i, &waitGroup)\")])]),_c('p',[_vm._v(\"The function concurrentTaks is also modified (it’s signature, but also its body) :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"func concurrentTaks(taskNumber int, waitGroup *sync.WaitGroup) {\\n fmt.Printf(\\\"BEGIN Execute task number %d \\\\n\\\", taskNumber)\\n time.Sleep(100 * time.Millisecond)\\n fmt.Printf(\\\"END Execute task number %d \\\\n\\\", taskNumber)\\n waitGroup.Done()\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We are calling the method \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"waitGroup.Done()\")])]),_vm._v(\" at the end of the function.\")])]),_c('li',[_c('p',[_vm._v(\"The \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Done\")])]),_vm._v(\" method will decrement the internal counter.\")])])]),_c('p',[_vm._v(\"When the internal counter has reached 0 (meaning that all our goroutines have finished) the main goroutine is released.\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn7\",\"id\":\"fnref7\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"7\")])]),_vm._v(\".\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"for i := 0; i < 10; i++ {\\n //...\\n}\\nwaitGroup.Wait() // we block the main goroutine (to wait for the previous goroutines to finish)\\nfinishTask()\\nfmt.Printf(\\\"Program end \\\\n\\\")\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"what-you-need-to-remember\"}}),_c('h2',{attrs:{\"data-number\":\"9.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"9.2\")]),_vm._v(\" What you need to remember \"),_c('a',{attrs:{\"href\":\"#what-you-need-to-remember\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_vm._v(\"Create a waitGroup :\")])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"var waitGroup sync.WaitGroup\")])]),_c('ul',[_c('li',[_vm._v(\"Increment the wait group counter :\")])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"waitGroup.Add(1)\")])]),_c('ul',[_c('li',[_vm._v(\"Decrement the wait group counter :\")])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"waitGroup.Done()\")])]),_c('ul',[_c('li',[_vm._v(\"Block the current goroutine until all goroutines have finished :\")])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"waitGroup.Wait()\")])]),_c('ul',[_c('li',[_vm._v(\"You must pass a \"),_c('strong',[_vm._v(\"pointer to the wait group\")]),_vm._v(\" to your goroutines.\")])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"application-wait-group-channels\"}}),_c('h1',{attrs:{\"data-number\":\"10\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10\")]),_vm._v(\" Application : wait group & channels \"),_c('a',{attrs:{\"href\":\"#application-wait-group-channels\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"mission\"}}),_c('h2',{attrs:{\"data-number\":\"10.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.1\")]),_vm._v(\" Mission \"),_c('a',{attrs:{\"href\":\"#mission\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"An e-commmerce website saves each visit in a database. For each visit we have :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"An unique id (UUID v4)\")]),_c('ul',[_c('li',[_vm._v(\"ex : 5ce7fef2-c53a-4b79-bcbb-669c9799fa86\")])])]),_c('li',[_c('p',[_vm._v(\"The page visited (string)\")]),_c('ul',[_c('li',[_vm._v(\"ex : /product-6\")])])]),_c('li',[_c('p',[_vm._v(\"The date of the visit\")])]),_c('li',[_c('p',[_vm._v(\"A session hash\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"ex : 8722b6f78a69aeac3736bfcaa1dd7e4e7a77834dec2adf27e007ed1c998b34df\")])]),_c('li',[_c('p',[_vm._v(\"It is used to group page views by sessions\")])])])])]),_c('p',[_vm._v(\"The marketing team wants to to list the most popular products and their related performance.\")]),_c('p',[_vm._v(\"They want to have for each date the number of visits for each page :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Date : 25 January 2020 :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"/product-45 : 254 visits\")])]),_c('li',[_c('p',[_vm._v(\"/product-22 : 2345 visits\")])]),_c('li',[_c('p',[_vm._v(\"/home : 2000 visits.\")])]),_c('li',[_c('p',[_vm._v(\".…\")])])])]),_c('li',[_c('p',[_vm._v(\"Date : 30 January 2020 :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"/product-45 : 125 visits\")])]),_c('li',[_c('p',[_vm._v(\"/home : 2000 visits.\")])]),_c('li',[_c('p',[_vm._v(\"...\")])])])])]),_c('p',[_vm._v(\"After querying the database of visits you have extracted a JSON file with the following format :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"{\\n \\\"20-02-2019\\\": [\\n {\\n \\\"id\\\": \\\"b5c92427-7095-470e-985b-8df7ebe7ed2f\\\",\\n \\\"page\\\": \\\"/product-8\\\",\\n \\\"sessionHash\\\": \\\"48cd2ad413df8fd263d745275a6a9a95b9cad5374b67d6877c764fb40f29fd0c\\\"\\n },\\n {\\n \\\"id\\\": \\\"bdbd3948-b336-4cb1-badd-390dfe8c0459\\\",\\n \\\"page\\\": \\\"/product-1\\\",\\n \\\"sessionHash\\\": \\\"c02793f8fb7bb09efb7721aa5962c1b8de809e7ac720463f6ea66c0f4f7957b2\\\"\\n },\\n {\\n \\\"id\\\": \\\"b9a70a12-f6b1-4d7c-ae61-73fcd80b9992\\\",\\n \\\"page\\\": \\\"/product-8\\\",\\n \\\"sessionHash\\\": \\\"774f6b0f07c2ee4bce93ee36a9678b2f1022cda646ce36b1fc3b3205dee5646a\\\"\\n }\\n ],\\n \\\"19-02-2019\\\": [\\n {\\n \\\"id\\\": \\\"9c2887c4-19ed-4cce-8998-3fe8b3662fba\\\",\\n \\\"page\\\": \\\"/product-6\\\",\\n \\\"sessionHash\\\": \\\"5d91fe5022b6186dc1fb81d8f31122fccf0a036f5f381d7dfc298b6aaf889e35\\\"\\n },\\n {\\n \\\"id\\\": \\\"adbf1651-f6bd-453a-97af-c860d153e981\\\",\\n \\\"page\\\": \\\"/product-3\\\",\\n \\\"sessionHash\\\": \\\"48cd2ad413df8fd263d745275a6a9a95b9cad5374b67d6877c764fb40f29fd0c\\\"\\n },\\n {\\n \\\"id\\\": \\\"80a09881-675f-4569-bdb0-28c6983aaee4\\\",\\n \\\"page\\\": \\\"/basket\\\",\\n \\\"sessionHash\\\": \\\"5d91fe5022b6186dc1fb81d8f31122fccf0a036f5f381d7dfc298b6aaf889e35\\\"\\n }\\n ]\\n}\")])]),_c('p',[_vm._v(\"You are asked to build a program with the following input/output :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"INPUT : A JSON file similar to the previous snippet.\")]),_c('ul',[_c('li',[_vm._v(\"You can download a sample JSON file here :\")])])]),_c('li',[_c('p',[_vm._v(\"OUTPUT : the statistics for each day formatted in JSON.\")])])]),_c('p',[_vm._v(\"Example OUTPUT :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"[\\n {\\n \\\"date\\\": \\\"20-02-2019\\\",\\n \\\"byPage\\\": {\\n \\\"/product-8\\\": 2,\\n \\\"/product-1\\\": 1\\n }\\n },\\n {\\n \\\"date\\\": \\\"19-02-2019\\\",\\n \\\"byPage\\\": {\\n \\\"/basket\\\": 1,\\n \\\"/product-3\\\": 1,\\n \\\"/product-6\\\": 1\\n }\\n }\\n]\")])]),_c('p',[_vm._v(\"Your program should use channels and wait groups.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"recommendations\"}}),_c('h3',{attrs:{\"data-number\":\"10.1.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.1.1\")]),_vm._v(\" Recommendations \"),_c('a',{attrs:{\"href\":\"#recommendations\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"You will need to load the contents of the INPUT file into memory\")])]),_c('li',[_c('p',[_vm._v(\"You will also need to unmarshal the JSON data loaded\")])]),_c('li',[_c('p',[_vm._v(\"Think about how you can split the work into multiple independant tasks.\")])]),_c('li',[_c('p',[_vm._v(\"Create a worker function that will handle a single tasks\")])]),_c('li',[_c('p',[_vm._v(\"Your workers can communicate with your main goroutine through channels\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"solution\"}}),_c('h2',{attrs:{\"data-number\":\"10.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2\")]),_vm._v(\" Solution \"),_c('a',{attrs:{\"href\":\"#solution\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"project-initialization\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.1\")]),_vm._v(\" Project initialization \"),_c('a',{attrs:{\"href\":\"#project-initialization\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Create a directory\")])]),_c('li',[_c('p',[_vm._v(\"And then launch the command go mod init name/of/your/module to initialize the module\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"load-input-and-unmarshal-json\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.2\")]),_vm._v(\" Load input and unmarshal JSON \"),_c('a',{attrs:{\"href\":\"#load-input-and-unmarshal-json\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"First we create a struct that will allow us to unmarshall the given input :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/application1/visit/visit.go\\npackage visit\\n\\ntype Visit struct {\\n ID string `json:\\\"id\\\"`\\n Page string `json:\\\"page\\\"`\\n SessionHash string `json:\\\"sessionHash\\\"`\\n}\")])]),_c('p',[_vm._v(\"This struct type is placed into a new package visit.\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/application1/main.go\\n\\ndata, err := ioutil.ReadFile(\\\"data.json\\\")\\nif err != nil {\\n log.Fatal(err)\\n}\\ndayStats := make(map[string][]visit.Visit)\\nerr = json.Unmarshal(data, &dayStats)\\nif err != nil {\\n log.Fatal(err)\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The file data.json is loaded\")])]),_c('li',[_c('p',[_vm._v(\"Next we initialize a map \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"dayStats\")])]),_vm._v(\" that will contain the unmarshaled data\")]),_c('ul',[_c('li',[_vm._v(\"For each date we have a slice of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"visit.Visit\")])]),_vm._v(\".\")])])])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"json.Unmarshal\")])]),_vm._v(\" parses the input json and stores the result into \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"dayStats\")])]),_vm._v(\".\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"how-to-split-the-work\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.3\")]),_vm._v(\" How to split the work ? \"),_c('a',{attrs:{\"href\":\"#how-to-split-the-work\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"We can split the work by date. Each daily load of visits can be treated independently. We create a \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Task\")])]),_vm._v(\" struct :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"type Task struct {\\n Date string\\n Visits []visit.Visit\\n}\")])]),_c('p',[_vm._v(\"We will give to each worker a variable of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Task\")])]),_vm._v(\" through an input channel.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"output-struct\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.4\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.4\")]),_vm._v(\" Output struct \"),_c('a',{attrs:{\"href\":\"#output-struct\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The output of our progam is a slice of daily statistics. We create a type struct \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"DailyStat\")])]),_vm._v(\" to hold the stats for a particular day :\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"type DailyStat struct {\\n Date string `json:\\\"date\\\"`\\n ByPage map[string]int `json:\\\"byPage\\\"`\\n}\")])]),_c('p',[_vm._v(\"The final output has the type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"[]DailyStat\")])]),_vm._v(\" (a slice of the previous struct)\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"wait-group-channel-creation\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.5\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.5\")]),_vm._v(\" Wait group / channel creation \"),_c('a',{attrs:{\"href\":\"#wait-group-channel-creation\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"var w8 sync.WaitGroup\\nw8.Add(len(dayStats))\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We initialize a wait group: \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"w8\")])])])]),_c('li',[_c('p',[_vm._v(\"Right after initialization we add to it’s internal counter the value \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"numberOfWorkers\")])])])]),_c('li',[_c('p',[_vm._v(\"By doing so we prepare our program to wait for each worker to finish\")])])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"inputCh := make(chan Task, 10)\\noutputCh := make(chan DailyStat, len(dayStats))\")])]),_c('ul',[_c('li',[_vm._v(\"We create two bidirectional buffered channels.\")])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"inputCh\")])]),_vm._v(\" will be used to send the tasks to the workers.\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"This channel has a buffer of 10\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"By setting the buffer size to 10 we will control the “throughput” (the rate at which our tasks will be processed)\")])]),_c('li',[_c('p',[_vm._v(\"The main goroutine can send 10 task maximum into the channel\")])]),_c('li',[_c('p',[_vm._v(\"When 10 tasks are sent, the main goroutine will block until it can add a new task\")])])])])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"outputCh\")])]),_vm._v(\" will be used to communicate the results from workers to the main goroutine\")]),_c('figure',[_c('b-img',{staticClass:\"img-book\",attrs:{\"src\":require('@/assets/images/application_channel_chans.png'),\"alt\":\"Input / output channels\",\"fluid\":\"\",\"thumbnail\":\"\"}}),_c('figcaption',{attrs:{\"aria-hidden\":\"true\"}},[_vm._v(\"Input / output channels\")])],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"worker\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.6\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.6\")]),_vm._v(\" Worker \"),_c('a',{attrs:{\"href\":\"#worker\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/application1/main.go \\n\\nfunc worker(in chan Task, workerId int, out chan DailyStat, w8 *sync.WaitGroup) {\\n for received := range in {\\n m := make(map[string]int)\\n for _, v := range received.Visits {\\n m[v.Page]++\\n }\\n out <- DailyStat{\\n Date: received.Date,\\n ByPage: m,\\n }\\n fmt.Printf(\\\"[worker %d] finished task \\\\n\\\", workerId)\\n }\\n // when the channel is closed the for loop is exited\\n log.Println(\\\"worker quit\\\")\\n w8.Done()\\n}\")])]),_c('p',[_vm._v(\"The worker is a function. It takes as input an input channel and an output channel.\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"With a for loop we range over message received from the input channel.s\")])]),_c('li',[_c('p',[_vm._v(\"Each message is a variable of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Task\")])])])]),_c('li',[_c('p',[_vm._v(\"With a map we will count the visits for each page.\")]),_c('ul',[_c('li',[_c('p',[_c('u',[_vm._v(\"Key\")]),_vm._v(\" : the page name (ex : /product-8)\")])]),_c('li',[_c('p',[_c('u',[_vm._v(\"Value\")]),_vm._v(\": the number of visits (ex : 458)\")])])])]),_c('li',[_c('p',[_vm._v(\"Once the visits are counted we send the result to the output channel.\")])]),_c('li',[_c('p',[_vm._v(\"The for loop will exit when the close signal is sent to the input channel\")])]),_c('li',[_c('p',[_vm._v(\"At the end the wait group counter is decreased by one : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"w8.Done()\")])])])]),_c('li',[_c('p',[_vm._v(\"We signal to the main goroutine that one goroutine has finished it’s mission.\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"worker-creation-and-send-tasks-to-the-input-channel\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.7\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.7\")]),_vm._v(\" Worker creation and send tasks to the input channel \"),_c('a',{attrs:{\"href\":\"#worker-creation-and-send-tasks-to-the-input-channel\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// create the workers\\nfor k := 0; k < numberOfWorkers; k++ {\\n go worker(inputCh, k, outputCh, &w8)\\n}\\n// send the tasks\\nfor date, visits := range dayStats {\\n inputCh <- Task{\\n Date: date,\\n Visits: visits,\\n }\\n}\\n// we say that we will not send any new data on the input channel\\nclose(inputCh)\\n// wait for all tasks to be completed\\nw8.Wait()\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We create our workers with a for loop\")])]),_c('li',[_c('p',[_vm._v(\"We iterate over \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"dayStats\")])]),_vm._v(\" to send the tasks to the input channel\")])]),_c('li',[_c('p',[_vm._v(\"We close the input channel when all tasks are sent.\")])])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"w8.Wait()\")])]),_vm._v(\" will wait for all workers to finish\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"collect-the-results\"}}),_c('h3',{attrs:{\"data-number\":\"10.2.8\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"10.2.8\")]),_vm._v(\" Collect the results \"),_c('a',{attrs:{\"href\":\"#collect-the-results\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// when all treatment is finished we close the output channel\\nclose(outputCh)\\n// collect the result\\ndone := make([]DailyStat, 0, len(dayStats))\\nfor out := range outputCh {\\n done = append(done, out)\\n}\\n\\nres, err := json.Marshal(done)\\nif err != nil {\\n log.Fatal(err)\\n}\\nerr = ioutil.WriteFile(\\\"results.json\\\", res, 0644)\\nif err != nil {\\n log.Fatal(err)\\n}\\nlog.Println(\\\"done !\\\")\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The last part is simple\")])]),_c('li',[_c('p',[_vm._v(\"We close the output channel\")])]),_c('li',[_c('p',[_vm._v(\"Then we collect the results from the output channel (with a for loop)\")])]),_c('li',[_c('p',[_vm._v(\"Each result is appended to the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"done\")])]),_vm._v(\" slice\")])])]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"done\")])]),_vm._v(\" is then marshalled to JSON and the result is persisted to the result.json file.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"mutexes\"}}),_c('h1',{attrs:{\"data-number\":\"11\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"11\")]),_vm._v(\" Mutexes \"),_c('a',{attrs:{\"href\":\"#mutexes\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"a-synchronization-tool\"}}),_c('h2',{attrs:{\"data-number\":\"11.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"11.1\")]),_vm._v(\" A synchronization tool \"),_c('a',{attrs:{\"href\":\"#a-synchronization-tool\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A mutex is a synchronization tool. Mutex is the abbreviation of \"),_c('strong',[_vm._v(\"Mut\")]),_vm._v(\"ual \"),_c('strong',[_vm._v(\"Ex\")]),_vm._v(\"clusion. Let’s make a detour via logic theory to better understand this concept.\")]),_c('p',[_vm._v(\"We say that two events are \"),_c('strong',[_vm._v(\"mutually exclusive\")]),_vm._v(\" if they cannot occur at the same time. For example the two events “the bike turn on the left” and “the bike turn on the right” are mutually exclusive. The biker cannot turn left and right at the same time.\")]),_c('p',[_vm._v(\"This mutual exclusion property is interesting for us. When we build concurrent programs a data race may occur.\")]),_c('p',[_vm._v(\"A data race may occur if two (or more) threads of execution access a shared variable\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"AND when one (or more) thread(s) want to update the variable\")])]),_c('li',[_c('p',[_vm._v(\"AND there is no “explicit mechanism to prevent the accesses from being simultaneous” in the threads \"),_c('b-link',{staticClass:\"citation\",attrs:{\"data-cites\":\"savage1997eraser\",\"href\":\"#savage1997eraser\"}},[_vm._v(\"[@savage1997eraser]\")]),_vm._v(\".\")],1)])]),_c('p',[_vm._v(\"We can avoid a data race by using a mutex. I’ll show you how :\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-usage\"}}),_c('h2',{attrs:{\"data-number\":\"11.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"11.2\")]),_vm._v(\" Example usage \"),_c('a',{attrs:{\"href\":\"#example-usage\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"buggy-program\"}}),_c('h3',{attrs:{\"data-number\":\"11.2.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"11.2.1\")]),_vm._v(\" Buggy program \"),_c('a',{attrs:{\"href\":\"#buggy-program\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/mutex-bug/main.go\\npackage main\\n\\nimport (\\n \\\"fmt\\\"\\n \\\"log\\\"\\n \\\"net/http\\\"\\n)\\n\\nvar requestCount int\\n\\nfunc main() {\\n http.HandleFunc(\\\"/status\\\", status)\\n err := http.ListenAndServe(\\\":8090\\\", nil)\\n if err != nil {\\n log.Fatal(err)\\n }\\n}\\n\\nfunc status(w http.ResponseWriter, req *http.Request) {\\n requestCount++\\n fmt.Fprintf(w, \\\"OK - count : %d \\\\n\\\", requestCount)\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"We created here a simple HTTP web server.\")])]),_c('li',[_c('p',[_vm._v(\"It has one single route : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"\\\"/status\\\"\")])])])]),_c('li',[_c('p',[_vm._v(\"We created a global variable \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"requestCount\")])]),_vm._v(\" of type int\")])]),_c('li',[_c('p',[_vm._v(\"This variable is incremented each time a request is sent to the route \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"\\\"/status\\\"\")])])])])]),_c('p',[_vm._v(\"Let’s create another program that will call this server...\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/mutex-server-call/main.go\\npackage main\\n\\nimport (\\n \\\"io/ioutil\\\"\\n \\\"log\\\"\\n \\\"net/http\\\"\\n \\\"sync\\\"\\n)\\n\\nfunc main() {\\n var w8 sync.WaitGroup\\n w8.Add(10)\\n for k := 0; k < 10; k++ {\\n go caller(&w8)\\n }\\n w8.Wait()\\n}\\n\\nfunc caller(w8 *sync.WaitGroup) {\\n for k := 0; k < 100; k++ {\\n res, err := http.Get(\\\"http://localhost:8090/status\\\")\\n if err != nil {\\n log.Fatal(err)\\n }\\n defer res.Body.Close()\\n s, err := ioutil.ReadAll(res.Body)\\n if err != nil {\\n log.Fatal(err)\\n }\\n log.Println(string(s))\\n }\\n w8.Done()\\n}\")])]),_c('p',[_vm._v(\"This program will launch \"),_c('strong',[_vm._v(\"10 goroutines\")]),_vm._v(\" that will each send \"),_c('strong',[_vm._v(\"100 requests\")]),_vm._v(\" to the server \"),_c('strong',[_vm._v(\"concurrently\")]),_vm._v(\" (10 * 100 = 1,000 requests). Note that we used a wait group to wait for all goroutines to finish.\")]),_c('p',[_vm._v(\"This program will print the body received at each request. Here are the 3 last lines\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"//...\\n2021/02/17 18:43:49 OK - count : 989 \\n2021/02/17 18:43:49 OK - count : 990 \\n2021/02/17 18:43:49 OK - count : 991\")])]),_c('p',[_vm._v(\"Wow ! We made 1,000 request but our counter displays 991 ...\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"add-a-mutex\"}}),_c('h3',{attrs:{\"data-number\":\"11.2.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"11.2.2\")]),_vm._v(\" Add a mutex \"),_c('a',{attrs:{\"href\":\"#add-a-mutex\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Let’s add a mutex to our previous code\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/mutex-added/main.go\\npackage main\\n\\nimport (\\n \\\"fmt\\\"\\n \\\"log\\\"\\n \\\"net/http\\\"\\n \\\"sync\\\"\\n)\\n\\nvar mu sync.Mutex\\nvar requestCount int\\n\\nfunc main() {\\n http.HandleFunc(\\\"/status\\\", status)\\n err := http.ListenAndServe(\\\":8091\\\", nil)\\n if err != nil {\\n log.Fatal(err)\\n }\\n}\\n\\nfunc status(w http.ResponseWriter, req *http.Request) {\\n mu.Lock()\\n requestCount++\\n mu.Unlock()\\n fmt.Fprintf(w, \\\"OK - count : %d \\\\n\\\", requestCount)\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"I created a new global variable named \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"mu\")])]),_vm._v(\" of type \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"sync.Mutex\")])]),_vm._v(\".\")])]),_c('li',[_c('p',[_vm._v(\"In the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"status\")])]),_vm._v(\" function we added 2 new lines before and after the incrementation\")])]),_c('li',[_c('p',[_vm._v(\"Before incrementing we call \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"mu.Lock()\")])])])]),_c('li',[_c('p',[_vm._v(\"After we call \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"mu.Unlock()\")])])])])]),_c('p',[_vm._v(\"If we test the program the counter will work as expected this time. \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"sync.Mutex\")])]),_vm._v(\" API The mutex API is simple. It has 2 exported methods : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Lock()\")])]),_vm._v(\" : this method will attempt to acquire the lock, If the lock is already in use by another goroutine it will block until it’s free\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Unlock()\")])]),_vm._v(\" : this method will release the lock. It will generate a runtime error if the mutex has not been locked before\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"mutex-hat\"}}),_c('h2',{attrs:{\"data-number\":\"11.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"11.3\")]),_vm._v(\" Mutex hat \"),_c('a',{attrs:{\"href\":\"#mutex-hat\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"There is a pretty common idiom called the Mutex hat\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn8\",\"id\":\"fnref8\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"8\")])]),_vm._v(\". In our previous example, we created a global mutex. Doing so is not advised. Mutexes are usually used in struct types.\")]),_c('p',[_vm._v(\"It is common to see a field of type sync.Mutex in a struct. Generally it is placed on top of the shared ressource it has to protect.\")]),_c('p',[_vm._v(\"Here is an example from the standard library (file database/sql/sql.go , package sql)\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"type DB struct {\\n //...\\n\\n mu sync.Mutex // protects following fields\\n freeConn []*driverConn\\n connRequests map[uint64]chan connRequest\\n nextRequest uint64 // Next key to use in connRequests.\\n numOpen int // number of opened and pending open connections\\n\\n //...\\n}\")])]),_c('p',[_vm._v(\"Here the mutex mu protects 4 fields. It is placed on top of those fields (like an hat)\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"concurrent-program-design\"}}),_c('BuyCopyInvite'),_c('h1',{attrs:{\"data-number\":\"12\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12\")]),_vm._v(\" Concurrent program design \"),_c('a',{attrs:{\"href\":\"#concurrent-program-design\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Designing concurrent programs is not easy. It requires some experience, but also some methodology. In this section we detail some tips that you can use to compose concurrent programs.\")]),_c('p',[_vm._v(\"We will use some concepts and ideas developped by T. Mattson in it’s excellent book \"),_c('b-link',{staticClass:\"citation\",attrs:{\"data-cites\":\"mattson2004patterns\",\"href\":\"#mattson2004patterns\"}},[_vm._v(\"[@mattson2004patterns]\")]),_vm._v(\".\")],1),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"identifying-the-tasks\"}}),_c('h2',{attrs:{\"data-number\":\"12.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.1\")]),_vm._v(\" Identifying the tasks \"),_c('a',{attrs:{\"href\":\"#identifying-the-tasks\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A \"),_c('strong',[_vm._v(\"task\")]),_vm._v(\" is an operation (that can be composed of sub-operations). A task can be composed of :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Input/Output operations\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Reading a file\")])]),_c('li',[_c('p',[_vm._v(\"Opening a tcp connection\")])])])]),_c('li',[_c('p',[_vm._v(\"A “computational” operation\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Get the remainder of an integer division\")])]),_c('li',[_c('p',[_vm._v(\"Iterate over a slice to find a specific element index.\")])])])])]),_c('p',[_vm._v(\"A task can be a single function, a method or a group of functions and methods.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"input-and-output\"}}),_c('h4',{attrs:{\"data-number\":\"12.1.0.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.1.0.1\")]),_vm._v(\" Input and output \"),_c('a',{attrs:{\"href\":\"#input-and-output\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"When considering a task it can be helpfull to isolate clearly :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The \"),_c('strong',[_vm._v(\"input\")]),_vm._v(\" : the data used in the task\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Ex :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"A slice of integers\")])]),_c('li',[_c('p',[_vm._v(\"A map\")])]),_c('li',[_c('p',[_vm._v(\"A pointer to a variable\")])])])])])]),_c('li',[_c('p',[_vm._v(\"The \"),_c('strong',[_vm._v(\"output\")]),_vm._v(\" : this is what is returned by the task.\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Ex :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"A modified version of the input data.\")])]),_c('li',[_c('p',[_vm._v(\"The result of a computation\")])]),_c('li',[_c('p',[_vm._v(\"A date, a string, a duration\")])])])])])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"identify-the-dependencies\"}}),_c('h2',{attrs:{\"data-number\":\"12.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.2\")]),_vm._v(\" Identify the dependencies \"),_c('a',{attrs:{\"href\":\"#identify-the-dependencies\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"A dependency is a link between two or more tasks. We can characterize two types of dependencies :\")]),_c('ul',[_c('li',[_c('p',[_c('strong',[_vm._v(\"Order dependency\")]),_vm._v(\" : the taks needs to be performed before or after another one.\")])]),_c('li',[_c('p',[_c('strong',[_vm._v(\"Data dependency\")]),_vm._v(\" : the execution of two tasks depend on the same piece of data\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-of-order-dependency\"}}),_c('h3',{attrs:{\"data-number\":\"12.2.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.2.1\")]),_vm._v(\" Example of order dependency \"),_c('a',{attrs:{\"href\":\"#example-of-order-dependency\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Usually the order dependency is quite easy to understand and detect. For instance let’s take the example of an ecommerce website. We have isolated the following two tasks :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Processing the payment of the order\")])]),_c('li',[_c('p',[_vm._v(\"Shipping the parcel\")])])]),_c('p',[_vm._v(\"It’s obvious that we need to process the payment before sending the goods. There is an order dependency between those two tasks. One task needs to be done before the other one.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"example-of-data-dependency\"}}),_c('h3',{attrs:{\"data-number\":\"12.2.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.2.2\")]),_vm._v(\" Example of data dependency \"),_c('a',{attrs:{\"href\":\"#example-of-data-dependency\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"Let’s keep the example of the ecommerce software. Usually this kind of applications store the product details and the stocks for each product. You have the three following tasks :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Decreasing the stock when an order has been placed\")])]),_c('li',[_c('p',[_vm._v(\"Reading the stock to display on the front end of the site\")])])]),_c('p',[_vm._v(\"Those two tasks depend on the stock data. In the first task (decreading the stock) we update it. In the second one we just read it. Those two operations are dependant on the stock variable.\")]),_c('p',[_vm._v(\"What happens if you read the stock and you update it at the exact same time ? You might display to the client wrong stock information. Data dependency cause data races if you do not implement mechanisms to prevent them.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"build\"}}),_c('h2',{attrs:{\"data-number\":\"12.3\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"12.3\")]),_vm._v(\" Build \"),_c('a',{attrs:{\"href\":\"#build\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('p',[_vm._v(\"The first step is to identify :\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Tasks\")])]),_c('li',[_c('p',[_vm._v(\"Tasks input / output\")])]),_c('li',[_c('p',[_vm._v(\"Dependencies between tasks\")])])]),_c('p',[_vm._v(\"The next step is to use those informations to build your program.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"If you have no dependencies between your tasks you are in a dream situation. All your tasks can be executed concurrently.\")])]),_c('li',[_c('p',[_vm._v(\"If you notice an order dependency then you can build a chain of workers.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"Let’s say you have 3 groups of tasks\")])]),_c('li',[_c('p',[_vm._v(\"We can create 3 workers\")])]),_c('li',[_c('p',[_vm._v(\"The workers will execute concurrently but you have to make sure that tasks will be executed in the given order\")])]),_c('li',[_c('p',[_vm._v(\"It can be achieved with 3 channels linking the 3 workers\")])])])]),_c('li',[_c('p',[_vm._v(\"When you spot a data dependency your program can be subject to data races.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_vm._v(\"Adding a mutex can usually protect you against this trap.\")])])])]),_c('p',[_vm._v(\"Of course those 3 situations may appear at the same time. As a consequence writing a concurrent program might be difficult. However mapping tasks and dependencies certainly help in the design process.\")]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"test-yourself\"}}),_c('h1',{attrs:{\"data-number\":\"13\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"13\")]),_vm._v(\" Test yourself \"),_c('a',{attrs:{\"href\":\"#test-yourself\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"questions\"}}),_c('h2',{attrs:{\"data-number\":\"13.1\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"13.1\")]),_vm._v(\" Questions \"),_c('a',{attrs:{\"href\":\"#questions\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// concurrency/test-question-1/main.go\\npackage main\\n\\nimport \\\"fmt\\\"\\n\\nfunc main() {\\n go count()\\n}\\n\\nfunc count() {\\n for k := 0; k < 10; k++ {\\n fmt.Println(k)\\n }\\n}\")])]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"What is the output of program 1?\")])]),_c('li',[_c('p',[_vm._v(\"True or False ? In a Go program you have at least one goroutine.\")])]),_c('li',[_c('p',[_vm._v(\"How to initialize an unbuffered channel of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"uint8\")])]),_vm._v(\" ?\")])]),_c('li',[_c('p',[_vm._v(\"In which case(s) a send operation is blocking ?\")])]),_c('li',[_c('p',[_vm._v(\"In a select statement, in which case(s) the default case is executed ?\")])]),_c('li',[_c('p',[_vm._v(\"True or False ? You should always pass a copy of a wait group to a goroutine, otherwise a data race may occur.\")])]),_c('li',[_c('p',[_vm._v(\"Fill in the blank. The method ____ from \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"sync.WaitGroup\")])]),_vm._v(\" decrements it’s internal counter.\")])]),_c('li',[_c('p',[_vm._v(\"Describe (with your own words) what a Mutex is.\")])]),_c('li',[_c('p',[_vm._v(\"Can you detect data races when you build your programs ?\")])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"answers\"}}),_c('h2',{attrs:{\"data-number\":\"13.2\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"13.2\")]),_vm._v(\" Answers \"),_c('a',{attrs:{\"href\":\"#answers\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"What is the output of the program 1?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"Nothing\")])]),_c('li',[_c('p',[_vm._v(\"In this program we launch a goroutine.\")])]),_c('li',[_c('p',[_vm._v(\"The main goroutine will \"),_c('strong',[_vm._v(\"NOT WAIT\")]),_vm._v(\" for the secong goroutine to return.\")])]),_c('li',[_c('p',[_vm._v(\"You can use a wait group for instance to wait for the end of the second goroutine\")])])])]),_c('li',[_c('p',[_vm._v(\"True or False. In a Go program you have at least one goroutine.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"True\")])]),_c('li',[_c('p',[_vm._v(\"It is called the “main goroutine”\")])])])]),_c('li',[_c('p',[_vm._v(\"How to initialize an unbuffered channel of \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"uint8\")])]),_vm._v(\" ?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"with the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"make\")])]),_vm._v(\" builtin\")])]),_c('li',[_c('p',[_vm._v(\"make(chan uint8)\")])])])]),_c('li',[_c('p',[_vm._v(\"In which case(s) a send operation is blocking ?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"For unbuffered channels\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_vm._v(\"A send operation is blocking until a receiver is ready to receive the message sent\")])])]),_c('li',[_c('p',[_vm._v(\"For buffered channels\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_vm._v(\"A send operation blocks when the channel buffer is full\")])])])])]),_c('li',[_c('p',[_vm._v(\"In a select statement, in which case(s) the default case is executed ?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"A select statement list communication operations\")])]),_c('li',[_c('p',[_vm._v(\"When no communication operation can proceed the default case is executed.\")])])])]),_c('li',[_c('p',[_vm._v(\"True or False ? You should always pass a copy of a wait group to a goroutine, otherwise a data race may occur.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"False\")])]),_c('li',[_c('p',[_vm._v(\"You should always pass a pointer to a wait group to your goroutines\")])])])]),_c('li',[_c('p',[_vm._v(\"Fill in the blank. The method ____ from \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"sync.WaitGroup\")])]),_vm._v(\" decrements it’s internal counter.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"Done()\")])]),_c('li',[_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"Add(-1)\")])]),_vm._v(\" is also valid.\")])])])]),_c('li',[_c('p',[_vm._v(\"Describe (with your own words) what a Mutex is.\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"A Mutex is a synchronization primitive that is used to synchronize the usage of a shared resource.\")])]),_c('li',[_c('p',[_vm._v(\"It is a protection against data races.\")])])])]),_c('li',[_c('p',[_vm._v(\"Can you detect data races when you build your programs ?\")]),_c('ol',{attrs:{\"type\":\"1\"}},[_c('li',[_c('p',[_vm._v(\"Yes !\")])]),_c('li',[_c('p',[_vm._v(\"Go can detect them.\")])]),_c('li',[_c('p',[_vm._v(\"Use the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"-race\")])]),_vm._v(\" flag when you build your program.\")])])])])]),_c('div',{staticClass:\"anchor\",attrs:{\"id\":\"key-takeways\"}}),_c('h1',{attrs:{\"data-number\":\"14\"}},[_c('span',{staticClass:\"header-section-number\"},[_vm._v(\"14\")]),_vm._v(\" Key Takeways \"),_c('a',{attrs:{\"href\":\"#key-takeways\"}},[_c('b-icon-link45deg',{staticClass:\"heading-link-icon\",attrs:{\"font-scale\":\"0.7\"}})],1)]),_c('ul',[_c('li',[_c('p',[_vm._v(\"A goroutine can be created with the \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"go\")])]),_vm._v(\" statement\")])]),_c('li',[_c('p',[_vm._v(\"Any function can be executed in a goroutine\")]),_c('ul',[_c('li',[_vm._v(\"Ex : \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"go myFunc(a,b)\")])])])])]),_c('li',[_c('p',[_vm._v(\"A data race may occur if two (or more) threads of execution access a shared variable\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"AND when one (or more) thread(s) want to update the variable\")])]),_c('li',[_c('p',[_vm._v(\"AND there is no “explicit mechanism to prevent the accesses from being simultaneous” in the threads \"),_c('b-link',{staticClass:\"citation\",attrs:{\"data-cites\":\"savage1997eraser\",\"href\":\"#savage1997eraser\"}},[_vm._v(\"[@savage1997eraser]\")])],1)]),_c('li',[_c('p',[_vm._v(\"To detect data race you can use the -race flag when building or testing your programs\")])]),_c('li',[_c('p',[_vm._v(\"To protect a shared resource you can use a \"),_c('strong',[_vm._v(\"mutex\")]),_vm._v(\".\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"var mu sync.Mutex\")])])])])])]),_c('li',[_c('p',[_vm._v(\"A deadlock occurs when two components of a program are waiting for each others\")])]),_c('li',[_c('p',[_vm._v(\"A channel is typed communication pipeline\")])]),_c('li',[_c('p',[_vm._v(\"Goroutines can communicate together thanks to channels\")])]),_c('li',[_c('p',[_vm._v(\"Channels are allocated with the make builtin\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Bidirectional\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch := make(chan int)\")])])])]),_c('li',[_c('p',[_vm._v(\"Send only\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch := make(chan-> int)\")])])])]),_c('li',[_c('p',[_vm._v(\"Receive only\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch := make(chan<- int)\")])])])])])]),_c('li',[_c('p',[_vm._v(\"A channel can be buffered or unbuffered. The buffer size is set when the channel is created\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Unbuffered :\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch := make(chan int)\")])])])]),_c('li',[_c('p',[_vm._v(\"Buffered :\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"ch := make(chan int,8)\")])])]),_c('ul',[_c('li',[_vm._v(\"Buffer size / capacity = 8\")])])])])]),_c('li',[_c('p',[_vm._v(\"The arrow operator is used to send/receive data to/from a channel\")]),_c('ul',[_c('li',[_c('p',[_vm._v(\"Send :\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"syncCh <- true\")])])])]),_c('li',[_c('p',[_vm._v(\"Receive\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"received := <-syncCh\")])])])])])]),_c('li',[_c('p',[_vm._v(\"Closing a channel = no more values will be sent on the channel\")]),_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"close(ch)\")])])])]),_c('li',[_c('p',[_vm._v(\"The builtin \"),_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"len\")])]),_vm._v(\" returns the number of elements queued in a channel.\")])]),_c('li',[_c('p',[_vm._v(\"Select statements are used to choose “which of a set of possible send or receive operations will proceed”\"),_c('a',{staticClass:\"footnote-ref\",attrs:{\"href\":\"#fn9\",\"id\":\"fnref9\",\"role\":\"doc-noteref\"}},[_c('sup',[_vm._v(\"9\")])]),_vm._v(\".\")]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"select {\\ncase rec, ok := <-ch1:\\n if ok {\\n log.Printf(\\\"received on ch1 : %s\\\", rec)\\n }\\ncase rec, ok := <-ch2:\\n if ok {\\n log.Printf(\\\"received on ch2 : %s\\\", rec)\\n }\\ndefault:\\n log.Println(\\\"default case\\\")\\n}\")])]),_c('ul',[_c('li',[_c('p',[_vm._v(\"The first non blocking operation will be executed.\")])]),_c('li',[_c('p',[_vm._v(\"When all operations are blocking the default case is executed (if present)\")])])])]),_c('li',[_c('p',[_c('span',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\",\"style\":\"display: inline\"}},[_vm._v(\"sync.WaitGroup\")])]),_vm._v(\" is a handy type struct that can be used to wait for a group of goroutines to finish\")])])]),_c('pre',{directives:[{name:\"highlightjs\",rawName:\"v-highlightjs\"}]},[_c('code',{pre:true,attrs:{\"class\":\"go\"}},[_vm._v(\"// in the main goroutine\\nvar w8 sync.WaitGroup\\nw8.Add(numberOfWorkers)\\n\\n// when a worker has finished\\nw8.Done()\\n\\n// blocks until all goroutines are done\\nw8.Wait()\")])]),_c('section',{staticClass:\"footnotes\",attrs:{\"role\":\"doc-endnotes\"}},[_c('hr'),_c('ol',[_c('li',{attrs:{\"id\":\"fn1\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"Source : https://en.wikipedia.org/wiki/Concurrency_(computer_science)\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref1\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn2\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"https://vimeo.com/49718712\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref2\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn3\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"https://golang.org/ref/spec#Close\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref3\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn4\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"Taken from https://golang.org/doc/effective_go#channels\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref4\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn5\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"Source : https://golang.org/ref/spec#Select_statements\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref5\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn6\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"Source : Go Source code documentation\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref6\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn7\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"https://golang.org/src/sync/waitgroup.go\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref7\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn8\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"Identified by Dmitri Shuralyov : https://dmitri.shuralyov.com/idiomatic-go#mutex-hat\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref8\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])]),_c('li',{attrs:{\"id\":\"fn9\",\"role\":\"doc-endnote\"}},[_c('p',[_vm._v(\"Source : https://golang.org/ref/spec#Select_statements\"),_c('a',{staticClass:\"footnote-back\",attrs:{\"href\":\"#fnref9\",\"role\":\"doc-backlink\"}},[_vm._v(\"↩︎\")])])])])]),_c('h1',[_vm._v(\"Bibliography\")]),_c('ChapterBibliography',{attrs:{\"chapter-id\":\"Chap30Concurrency\"}}),_c('b-row',{staticClass:\"ml-1 mr-1 \"},[_c('b-col',{staticClass:\"text-center border mr-1 p-2\"},[_c('router-link',{attrs:{\"to\":{name:'Chap29DataStorageFilesAndDatabases'}}},[_c('p',[_c('u',[_c('small',[_vm._v(\"Previous\")])])]),_c('p',[_c('small',[_vm._v(\"Data storage : files and databases\")])])])],1),_c('b-col',{staticClass:\"text-center border p-1 \"},[_c('router-link',{attrs:{\"to\":{name:'Chap31Logging'}}},[_c('p',[_c('u',[_c('small',[_vm._v(\"Next\")])])]),_c('p',[_c('small',[_vm._v(\"Logging\")])])])],1)],1),_c('b-row',{staticClass:\"mt-1 ml-1 mr-1\"},[_c('b-col',{staticClass:\"text-center border p-1 \"},[_c('b-link',{attrs:{\"to\":{name:'Home'}}},[_vm._v(\"Table of contents\")])],1)],1),_c('FeedbackInvite'),_c('NewsletterInput'),_c('Footer')],1),_c('b-col')],1)],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Chap30Concurrency.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--13-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Chap30Concurrency.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Chap30Concurrency.vue?vue&type=template&id=0262cc22&scoped=true&\"\nimport script from \"./Chap30Concurrency.vue?vue&type=script&lang=js&\"\nexport * from \"./Chap30Concurrency.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0262cc22\",\n null\n \n)\n\nexport default component.exports","module.exports = __webpack_public_path__ + \"img/five_dining_philo.ddc91ca9.png\";","module.exports = __webpack_public_path__ + \"img/deadluck_unbuffered.21378e95.png\";","module.exports = __webpack_public_path__ + \"img/channel_unbuffered_buffered.ad501e31.png\";","module.exports = __webpack_public_path__ + \"img/ps-xau-example.4f32f9e5.png\";"],"sourceRoot":""}