<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>English - Concurrency (Tags) Feed</title><link>https://codepros.org/tags/concurrency/</link><description>Recent content</description><generator>Hugo 0.147.1</generator><language>en</language><lastBuildDate>Sat, 18 Apr 2026 12:58:00 +0000</lastBuildDate><atom:link href="https://codepros.org/tags/concurrency/index.xml" rel="self" type="application/rss+xml"/><category>Concurrency</category><item><title>Beginning Concurrency Patterns</title><link>https://codepros.org/blog/beginning-concurrency-patterns/</link><pubDate>Thu, 30 Dec 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/beginning-concurrency-patterns/</guid><category>triangle-go</category><category>go</category><category>intermediate</category><category>parallel-programming</category><category>concurrency</category><category>concurrent-design</category><category>best-practices</category><description>&lt;p>In this post I will cover some best practices for building concurrent
applications in Go using basic concurrency patterns and native primitives. The
patterns themselves are applicable to any language, but for these examples we
will use Go.&lt;/p>
&lt;p>Clone the repository for this post to follow along&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-shell" data-lang="shell">&lt;span class="line">&lt;span class="ln">1&lt;/span>&lt;span class="cl">git clone https://github.com/benjivesterby/may2021-triangle-meetup.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;h3 id="pipeline-pattern" class="position-relative">
Pipeline Pattern
&lt;a class="h-anchor ms-2 text-decoration-none link-secondary"
href="#pipeline-pattern"
aria-label="Link to this section: Pipeline Pattern">
&lt;i class="fa-sharp-duotone fa-solid fa-link" aria-hidden="true">&lt;/i>
&lt;/a>
&lt;a class="h-top ms-1 text-decoration-none link-secondary"
href="#top"
aria-label="Back to top">
&lt;i class="fa-sharp-duotone fa-regular fa-arrow-up" aria-hidden="true">&lt;/i>
&lt;/a>
&lt;button type="button"
class="h-share ms-1 btn btn-link p-0 text-decoration-none link-secondary"
data-share-target="pipeline-pattern"
aria-haspopup="dialog"
aria-label="Share link: Pipeline Pattern">
&lt;i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true">&lt;/i>
&lt;span class="visually-hidden">Share link&lt;/span>
&lt;/button>
&lt;/h3>&lt;div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
&lt;div class="hsm-dialog border rounded shadow-sm p-3" role="document">
&lt;div class="d-flex justify-content-between align-items-center border-bottom pb-2">
&lt;h2 id="headingShareTitle" class="h6 mb-0">Share this section&lt;/h2>
&lt;button type="button" class="hsm-close btn btn-sm btn-outline-secondary" aria-label="Close">×&lt;/button>
&lt;/div>
&lt;div class="hsm-body mt-3">
&lt;div class="input-group mb-3 hsm-url-group">
&lt;input id="headingShareInput" type="text" class="form-control" readonly aria-readonly="true" />
&lt;button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
&lt;i class="fa-duotone fa-clipboard" aria-hidden="true">&lt;/i>
&lt;/button>
&lt;/div>
&lt;div class="small mb-2 fw-semibold">Share link:&lt;/div>
&lt;ul class="list-inline mb-0 hsm-share-links">
&lt;li class="list-inline-item mb-2">
&lt;a id="share-twitter" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">Twitter Profile&lt;/a>
&lt;/li>
&lt;li class="list-inline-item mb-2">
&lt;a id="share-linkedin" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">LinkedIn Profile&lt;/a>
&lt;/li>
&lt;li class="list-inline-item mb-2">
&lt;a id="share-facebook" class="btn btn-sm btn-outline-primary" target="_blank" rel="noopener noreferrer">Facebook Profile&lt;/a>
&lt;/li>
&lt;/ul>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;style>
.heading-share-modal { position: fixed; inset: 0; display:flex; justify-content:center; align-items:center; background:rgba(0,0,0,.45); z-index:1050; padding:1rem; }
.heading-share-modal[hidden]{ display:none !important; }
.hsm-dialog { max-width:420px; width:100%; background: var(--bs-body-bg,#fff); color: var(--bs-body-color,#212529); border:1px solid var(--bs-border-color,rgba(0,0,0,.125)); border-radius: var(--bs-border-radius,.5rem); box-shadow:0 .5rem 1rem rgba(0,0,0,.25),0 0 0 1px rgba(255,255,255,.03); }
[data-bs-theme="dark"] .hsm-dialog { background: var(--bs-dark-bg-subtle,#21262c); color: var(--bs-light,#f8f9fa); border-color: rgba(255,255,255,.15); }
.hsm-header .hsm-close { line-height:1; font-weight:600; }
.hsm-share-links .btn { min-width:90px; }
.hsm-url-group { display:flex; }
.hsm-url-group .form-control { border-top-right-radius:0; border-bottom-right-radius:0; font-size:.875rem; align-items:center; margin-top: .4rem; }
.hsm-url-group .hsm-copy { border-top-left-radius:0; border-bottom-left-radius:0; display:flex; align-items:center; }
.hsm-url-group .hsm-copy i { font-size:.9rem; line-height:1; }
@media (min-width:768px){ .hsm-url-group .form-control { font-size:.9rem; } }
@media (max-width:420px){ .hsm-url-group .form-control { font-size:.84rem; } }
.hsm-url-group .form-control { background: var(--bs-secondary-bg,#f1f3f5); border-color: var(--bs-border-color,#ced4da); color: var(--bs-body-color,#212529); }
.hsm-url-group .form-control:focus { box-shadow:0 0 0 .15rem rgba(var(--bs-primary-rgb,13,110,253), .25); }
[data-bs-theme="dark"] .hsm-url-group .form-control { background:#2a3035; border-color: rgba(255,255,255,.15); color:#fff; }
[data-bs-theme="dark"] .hsm-url-group .form-control:focus { box-shadow:0 0 0 .15rem rgba(var(--bs-primary-rgb,49,132,253), .4); }
.heading-share-modal a.btn-outline-primary { --bs-btn-color: var(--bs-primary); --bs-btn-border-color: var(--bs-primary); }
[data-bs-theme="dark"] .heading-share-modal { background:rgba(0,0,0,.7); }
&lt;/style>
&lt;script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&amp;text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus &amp;&amp; typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest &amp;&amp; e.target.closest('.h-share');
if(shareBtn &amp;&amp; !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest &amp;&amp; e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn &amp;&amp; (e.target===copyBtn || (e.target.closest &amp;&amp; e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' &amp;&amp; isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' &amp;&amp; isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey &amp;&amp; document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey &amp;&amp; document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
&lt;/script>&lt;p>A pipeline pattern&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> &lt;sup id="fnref:2">&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref">2&lt;/a>&lt;/sup> consists of a number of stages that are connected
by a series of channels. The first stage is the source of the data, the last
stage is the sink of the data. A good example of this would be a data pipeline
where the first step mines the data, the subsequent steps cleans the data, and
the final step stores the sanitized data in a database.&lt;/p></description></item><item><title>Go Native Concurrency Primitives &amp; Best Practices</title><link>https://codepros.org/blog/go-native-concurrency-primitives/</link><pubDate>Thu, 30 Dec 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/go-native-concurrency-primitives/</guid><category>triangle-go</category><category>go</category><category>intermediate</category><category>parallel-programming</category><category>concurrency</category><category>concurrent-design</category><category>best-practices</category><description>&lt;p>&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/go-native-concurrency-primitives/images/sospecial_hu_8338207a0fec45a5.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid float-end me-3 mb-3"
src="https://codepros.org/blog/go-native-concurrency-primitives/images/sospecial_hu_6cee7c709e74391b.png"
srcset="https://codepros.org/blog/go-native-concurrency-primitives/images/sospecial_hu_6cee7c709e74391b.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="200"
height="150"
alt="A meme with the &amp;amp;ldquo;overly attached girlfriend&amp;amp;rdquo; image and text that reads &amp;amp;ldquo;You are so special!&amp;amp;rdquo;"
loading="lazy"
decoding="async"
style="max-width: 200px" />
&lt;/picture>&lt;/p>
&lt;p>The Go programming language was created with concurrency as a first class
citizen. It is a language that allows you to write programs that are highly
parallel with ease by abstracting away the details of parallelism behind
concurrency primitives&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> within the language.&lt;/p></description></item><item><title>Parallelism and Concurrency; What's the Difference?</title><link>https://codepros.org/blog/parallelism-vs-concurrency/</link><pubDate>Wed, 29 Dec 2021 06:00:00 -0500</pubDate><guid>https://codepros.org/blog/parallelism-vs-concurrency/</guid><category>triangle-go</category><category>go</category><category>computing-basics</category><category>intermediate</category><category>parallel-programming</category><category>concurrency</category><category>concurrent-design</category><description>&lt;p>&lt;picture>
&lt;source type="image/webp"
srcset="https://codepros.org/blog/parallelism-vs-concurrency/images/captain_hu_44d84a42c125837a.webp 1x"
sizes="(max-width: 768px) 100vw, 768px">
&lt;img class="img-fluid float-end me-3 mb-3"
src="https://codepros.org/blog/parallelism-vs-concurrency/images/captain_hu_2e2887d02def7b62.png"
srcset="https://codepros.org/blog/parallelism-vs-concurrency/images/captain_hu_2e2887d02def7b62.png 1x"
sizes="(max-width: 768px) 100vw, 768px"
width="300"
height="150"
alt="A photo of Captain America choking himself out in Avengers
Endgame"
loading="lazy"
decoding="async"
style="max-width: 300px" />
&lt;/picture>&lt;/p>
&lt;p>Parallelism in software is the execution of instructions simultaneously. Each
programming language either implements their own libraries, or provide native
support as part of the language, like Go. Parallelism allows software engineers
to side-step the physical limitations of the hardware by executing tasks in
parallel on multiple processors.&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p></description></item></channel></rss>