{"id":213,"date":"2020-01-03T09:10:44","date_gmt":"2020-01-03T09:10:44","guid":{"rendered":"https:\/\/www.samarthya.me\/wps\/?p=213"},"modified":"2020-01-03T10:13:34","modified_gmt":"2020-01-03T10:13:34","slug":"concurrency-golang","status":"publish","type":"post","link":"https:\/\/blog.samarthya.me\/wps\/2020\/01\/03\/concurrency-golang\/","title":{"rendered":"Concurrency &#8211; GOLANG"},"content":{"rendered":"<h1>Concurrency and Parallelism &#8211; (Helpful <a href=\"https:\/\/blog.golang.org\/concurrency-is-not-parallelism\">link<\/a>)<\/h1>\n<p>Last few weeks have been interesting, a new year just embarked, my learning pace slowed down; comparatively due to the festivities and obligations around, but I am still trying to maintain.<\/p>\n<p>This week\u00a0 tried another exercise from <a href=\"https:\/\/exercism.io\/my\/solutions\/0c4d940813284b0c8dacf70d93c0edab\">exercism.io. <\/a>If you have not seen this site, I recommend it highly. It is just a fun way of keeping yourself engaged in learning and trying out exercises, and all the while engaging with fellow programmers or mentors.<\/p>\n<p>This exercise, was about, counting the occurrence of characters in a string and trying to do it <a href=\"https:\/\/www.golang-book.com\/books\/intro\/10\">parallel<\/a>. The solution I wrote for it, is as under and will be explaining in detail.<\/p>\n<pre class=\"line-numbers solution-code language-go\"><code class=\" language-go\"><span class=\"token keyword\">package<\/span> letter\r\n\r\n<span class=\"token keyword\">import<\/span> <span class=\"token string\">\"sync\"<\/span>\r\n\r\n<span class=\"token comment\">\/\/ FreqMap records the frequency of each rune in a given text.<\/span>\r\n<span class=\"token keyword\">type<\/span> FreqMap <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">rune<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">int<\/span>\r\n\r\n<span class=\"token keyword\">type<\/span> SafeMap <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tval  FreqMap\r\n\tlock sync<span class=\"token punctuation\">.<\/span>Mutex\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token keyword\">func<\/span> <span class=\"token punctuation\">(<\/span>sm <span class=\"token operator\">*<\/span>SafeMap<span class=\"token punctuation\">)<\/span> <span class=\"token function\">Increment<\/span><span class=\"token punctuation\">(<\/span>e <span class=\"token builtin\">rune<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tsm<span class=\"token punctuation\">.<\/span>lock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\tsm<span class=\"token punctuation\">.<\/span>val<span class=\"token punctuation\">[<\/span>e<span class=\"token punctuation\">]<\/span><span class=\"token operator\">++<\/span>\r\n\tsm<span class=\"token punctuation\">.<\/span>lock<span class=\"token punctuation\">.<\/span><span class=\"token function\">Unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token comment\">\/\/ Frequency counts the frequency of each rune in a given text and returns this<\/span>\r\n<span class=\"token comment\">\/\/ data as a FreqMap.<\/span>\r\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">Frequency<\/span><span class=\"token punctuation\">(<\/span>s <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> FreqMap <span class=\"token punctuation\">{<\/span>\r\n\tm <span class=\"token operator\">:=<\/span> FreqMap<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>\r\n\t<span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> r <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> s <span class=\"token punctuation\">{<\/span>\r\n\t\tm<span class=\"token punctuation\">[<\/span>r<span class=\"token punctuation\">]<\/span><span class=\"token operator\">++<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\t<span class=\"token keyword\">return<\/span> m\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">ParallelFreq<\/span><span class=\"token punctuation\">(<\/span>s <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">,<\/span> sm <span class=\"token operator\">*<\/span>SafeMap<span class=\"token punctuation\">,<\/span> wg <span class=\"token operator\">*<\/span>sync<span class=\"token punctuation\">.<\/span>WaitGroup<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> r <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> s <span class=\"token punctuation\">{<\/span>\r\n\t\tsm<span class=\"token punctuation\">.<\/span><span class=\"token function\">Increment<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\r\n\t<span class=\"token keyword\">if<\/span> wg <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\twg<span class=\"token punctuation\">.<\/span><span class=\"token function\">Done<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\n\r\n<span class=\"token keyword\">func<\/span> <span class=\"token function\">ConcurrentFrequency<\/span><span class=\"token punctuation\">(<\/span>elements <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> FreqMap <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">var<\/span> sm SafeMap\r\n\r\n\t<span class=\"token keyword\">var<\/span> wg sync<span class=\"token punctuation\">.<\/span>WaitGroup\r\n\r\n\tsm<span class=\"token punctuation\">.<\/span>val <span class=\"token operator\">=<\/span> FreqMap<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>\r\n\r\n\twg<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">len<\/span><span class=\"token punctuation\">(<\/span>elements<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> r <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> elements <span class=\"token punctuation\">{<\/span>\r\n\t\t<span class=\"token keyword\">go<\/span> <span class=\"token function\">ParallelFreq<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>sm<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>wg<span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\twg<span class=\"token punctuation\">.<\/span><span class=\"token function\">Wait<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n\t<span class=\"token keyword\">return<\/span> sm<span class=\"token punctuation\">.<\/span>val\r\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<blockquote><p>The challenge was to do counting in parallel.<\/p><\/blockquote>\n<h2>Concurrency vs Parallel<\/h2>\n<p>What do we understand by concurrency and is it just another word for parallel execution?<\/p>\n<blockquote><p>They are related but not the same thing.<\/p><\/blockquote>\n<p>Concurrency is about DEALING with lots of things at once, it is about structure.<\/p>\n<p>Parallelism is about DOING lots of things at once, it is about execution.<\/p>\n<h3>GoRoutine<\/h3>\n<p>A <strong>goroutine<\/strong> is a function that is capable of running concurrently with other functions. To create a <strong>goroutine<\/strong> we use the keyword <code>go<\/code> followed by a function invocation:<\/p>\n<h2>Step 1<\/h2>\n<p>Defining the structure for storing the count and the letter.<\/p>\n<pre><code class=\" language-go\"><span class=\"token keyword\">type<\/span> <strong>FreqMap<\/strong> <span class=\"token keyword\">map<\/span><span class=\"token punctuation\">[<\/span><span class=\"token builtin\">rune<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">int<\/span>\r\n\r\n<span class=\"token keyword\">type<\/span> <strong>SafeMap<\/strong> <span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span>\r\n\tval  FreqMap\r\n\tlock sync<span class=\"token punctuation\">.<\/span>Mutex\r\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<h2>TYPE: FreqMap<\/h2>\n<p><strong>FreqMap<\/strong> allows you to define a map of rune and int. E.g. { {&#8216;a&#8217;, 2}, {&#8216;b&#8217;, 1}&#8230;}<\/p>\n<h2>STRUCT: SafeMap<\/h2>\n<p><strong>SafeMap<\/strong> allows you to extend the basic type <strong>FreqMap<\/strong> and add the synchronization behavior, as it will be used by multiple go routines in parallel.<\/p>\n<h2>Method: Parallel Counting &#8211; <code class=\" language-go\"><span class=\"token function\">ParallelFreq<\/span><\/code><\/h2>\n<p>In order to utilize the parallel counting I defined a method that utilizes the objects from sync:module of golang.<\/p>\n<pre><code class=\" language-go\"><span class=\"token keyword\">func<\/span> <span class=\"token function\">ParallelFreq<\/span><span class=\"token punctuation\">(<\/span>s <span class=\"token builtin\">string<\/span><span class=\"token punctuation\">,<\/span> sm <span class=\"token operator\">*<\/span>SafeMap<span class=\"token punctuation\">,<\/span> wg <span class=\"token operator\">*<\/span>sync<span class=\"token punctuation\">.<\/span>WaitGroup<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> r <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> s <span class=\"token punctuation\">{<\/span>\r\n\t\tsm<span class=\"token punctuation\">.<\/span><span class=\"token function\">Increment<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\r\n\t<span class=\"token keyword\">if<\/span> wg <span class=\"token operator\">!=<\/span> <span class=\"token boolean\">nil<\/span> <span class=\"token punctuation\">{<\/span>\r\n\t\twg<span class=\"token punctuation\">.<\/span><span class=\"token function\">Done<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<p>It takes in the following argument<\/p>\n<ol>\n<li>\u00a0<strong>s<\/strong> &#8211; String to be scanned through to populate the Map &#8211; <strong>SafeMap <\/strong>and when the processing is done it notifies the WaitGroup by invoking Done() method.<\/li>\n<li>\u00a0<strong>sm<\/strong> &#8211; <strong>SafeMap<\/strong> that has a method Increment() to increment the respective rune value.<\/li>\n<li>\u00a0<strong>wg<\/strong> &#8211; <strong>WaitGroup<\/strong> to be notified of task completion.<\/li>\n<\/ol>\n<h2>GoRoutine creator &#8211; ConcurrentFrequency<\/h2>\n<pre><code class=\" language-go\"><span class=\"token keyword\">func<\/span> <span class=\"token function\">ConcurrentFrequency<\/span><span class=\"token punctuation\">(<\/span>elements <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token builtin\">string<\/span><span class=\"token punctuation\">)<\/span> FreqMap <span class=\"token punctuation\">{<\/span>\r\n\t<span class=\"token keyword\">var<\/span> sm SafeMap\r\n\r\n\t<span class=\"token keyword\">var<\/span> wg sync<span class=\"token punctuation\">.<\/span>WaitGroup\r\n\r\n\tsm<span class=\"token punctuation\">.<\/span>val <span class=\"token operator\">=<\/span> FreqMap<span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span>\r\n\r\n\twg<span class=\"token punctuation\">.<\/span><span class=\"token function\">Add<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">len<\/span><span class=\"token punctuation\">(<\/span>elements<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token keyword\">for<\/span> <span class=\"token boolean\">_<\/span><span class=\"token punctuation\">,<\/span> r <span class=\"token operator\">:=<\/span> <span class=\"token keyword\">range<\/span> elements <span class=\"token punctuation\">{<\/span>\r\n\t\t<span class=\"token keyword\">go<\/span> <span class=\"token function\">ParallelFreq<\/span><span class=\"token punctuation\">(<\/span>r<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>sm<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>wg<span class=\"token punctuation\">)<\/span>\r\n\t<span class=\"token punctuation\">}<\/span>\r\n\twg<span class=\"token punctuation\">.<\/span><span class=\"token function\">Wait<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\r\n\r\n\t<span class=\"token keyword\">return<\/span> sm<span class=\"token punctuation\">.<\/span>val\r\n<span class=\"token punctuation\">}<\/span><\/code><\/pre>\n<ol>\n<li>It receives an input a slice of strings<\/li>\n<li>Defines a WaitGroup for the len of the slice.<\/li>\n<li>Creates go routines by invoking <em>go ParallelFreq.<\/em><\/li>\n<li>Waits for all the goroutines to finish<\/li>\n<li>Returns the FreqMap.<\/li>\n<\/ol>\n<h2>Benchmark : go test -v &#8211;bench . &#8211;benchmem<\/h2>\n<pre>pkg: letter\r\nBenchmarkSequentialFrequency-16 55041 21012 ns\/op 2995 B\/op 13 allocs\/op\r\nBenchmarkConcurrentFrequency-16 25628 48832 ns\/op 2136 B\/op 14 allocs\/op\r\nPASS\r\nok letter 3.127s<\/pre>\n<p>You can further optimise the declaration and initialization of the SafeMap<\/p>\n<div>\n<pre>var sm = SafeMap{FreqMap{}, sync.Mutex{}}<\/pre>\n<\/div>\n<p>* You can find more samples in my GitRepo.<\/p>\n<p style=\"text-align: center;\">&#8212; THE &#8211; END &#8212;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Concurrency and Parallelism &#8211; (Helpful link) Last few weeks have been interesting, a new year just embarked, my learning pace slowed down; comparatively due to the festivities and obligations around, but I am still trying to maintain. This week\u00a0 tried another exercise from exercism.io. If you have not seen this site, I recommend it highly. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":214,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[1],"tags":[23,26,24,25],"class_list":["post-213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-others","tag-golang","tag-mutex","tag-sync","tag-waitgroup"],"_links":{"self":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/comments?post=213"}],"version-history":[{"count":0,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/posts\/213\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media\/214"}],"wp:attachment":[{"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/media?parent=213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/categories?post=213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.samarthya.me\/wps\/wp-json\/wp\/v2\/tags?post=213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}