<story><title>Even in Go, concurrency is still not easy</title><url>https://utcc.utoronto.ca/~cks/space/blog/programming/GoConcurrencyStillNotEasy</url></story><parent_chain><item><author>naikrovek</author><text>Hmm, I don&amp;#x27;t know.  I had this limited concurrency issue on the first Go program I ever wrote, and I&amp;#x27;m very new to concurrent stuff, certainly if you only count the past ten years or so.&lt;p&gt;I figured this out in Go about 30 minutes after I realized I needed to limit concurrency, and I&amp;#x27;m a dumbass, basically.&lt;p&gt;So, I&amp;#x27;m not sure that &amp;quot;still not easy&amp;quot; is accurate, especially given that I have a lot of trouble conceptualizing async and await, as used in C#.  In fact, I don&amp;#x27;t think I&amp;#x27;ve ever successfully used that paradigm in C#.  I&amp;#x27;ve been told that C# async and await are &amp;quot;easy&amp;quot; and this article says Go concurrency is &amp;quot;still not easy&amp;quot; and I&amp;#x27;ve had the exact opposite experience in both cases.&lt;p&gt;In fact I really don&amp;#x27;t understand why async and await is even a thing anymore, given the paradigm that Go uses and the example it sets.  It is almost supernatural in its ease, for me.</text></item></parent_chain><comment><author>pjmlp</author><text>The paradigm that Go uses only fits a very narrow case of concurrency, and actually it is quite old.&lt;p&gt;Modula-2, Concurrent Pascal, Active Oberon already had similar constructs.&lt;p&gt;Async&amp;#x2F;await are configurable, not only can you replace the task scheduler algorithms, if the type being applied on does provide some magic methods, the runtime will use them instead of the default ones.&lt;p&gt;This allows for very powerful concurrency optimizations and workflows, that still look like plain async&amp;#x2F;await calls.</text></comment>
<story><title>Even in Go, concurrency is still not easy</title><url>https://utcc.utoronto.ca/~cks/space/blog/programming/GoConcurrencyStillNotEasy</url></story><parent_chain><item><author>naikrovek</author><text>Hmm, I don&amp;#x27;t know.  I had this limited concurrency issue on the first Go program I ever wrote, and I&amp;#x27;m very new to concurrent stuff, certainly if you only count the past ten years or so.&lt;p&gt;I figured this out in Go about 30 minutes after I realized I needed to limit concurrency, and I&amp;#x27;m a dumbass, basically.&lt;p&gt;So, I&amp;#x27;m not sure that &amp;quot;still not easy&amp;quot; is accurate, especially given that I have a lot of trouble conceptualizing async and await, as used in C#.  In fact, I don&amp;#x27;t think I&amp;#x27;ve ever successfully used that paradigm in C#.  I&amp;#x27;ve been told that C# async and await are &amp;quot;easy&amp;quot; and this article says Go concurrency is &amp;quot;still not easy&amp;quot; and I&amp;#x27;ve had the exact opposite experience in both cases.&lt;p&gt;In fact I really don&amp;#x27;t understand why async and await is even a thing anymore, given the paradigm that Go uses and the example it sets.  It is almost supernatural in its ease, for me.</text></item></parent_chain><comment><author>jshen</author><text>I’ll bet your Go code, if it isn’t trivial, has race conditions all over and you just don’t realize it.</text></comment>