β‘ asyncio
asyncio is a built-in Python module used to write and run asynchronous programs.
It works mainly with async and await.
πΉ Basic Example
import asyncio
async def greet():
print("Hello!")
await asyncio.sleep(2)
print("Done!")
asyncio.run(greet())Here:
async def β Creates a coroutine
await β Waits without blocking other async tasks
asyncio β Manages the asynchronous executionπ Running Multiple Tasks
asyncio.gather() can run multiple coroutines concurrently.
import asyncio
async def task(name):
print(name, "started")
await asyncio.sleep(2)
print(name, "finished")
async def main():
await asyncio.gather(
task("Task 1"),
task("Task 2")
)
asyncio.run(main())Task 1 started
Task 2 started
Task 1 finished
Task 2 finishedBoth tasks can wait concurrently, instead of waiting for Task 1 to completely finish before starting Task 2.
π οΈ Common asyncio Functions
asyncio.run() # Run an async program
asyncio.sleep() # Pause an async task
asyncio.gather() # Run multiple coroutines concurrently
asyncio.create_task() # Schedule a coroutine as a taskasyncio = Python's built-in framework for asynchronous programming.
<div class="infographic-pyasyncio">
<style>
.infographic-pyasyncio {
--ink:#1a1a1a; --ink-soft:#5c5c5c; --paper:#fff; --paper-alt:#f0ece4;
--accent:#2563eb; --accent-soft:#e3ebfd; --line:#ddd6c9;
--ok:#1f9d55; --ok-soft:#e3f5ec;
--mono-font:'IBM Plex Mono','SFMono-Regular',Menlo,monospace;
--display-font:'Fraunces',Georgia,serif; --body-font:'Inter',system-ui,sans-serif;
box-sizing:border-box; max-width:660px; margin:0 auto; font-family:var(--body-font); color:var(--ink); background:var(--paper);
}
.infographic-pyasyncio[data-theme="dark"] {
--ink:#e8e6e1; --ink-soft:#9a968c; --paper:#121212; --paper-alt:#1e1e26;
--accent:#5b8def; --accent-soft:#202942; --line:#2c313d;
--ok:#6fdc8c; --ok-soft:#16342a;
}
.infographic-pyasyncio *,.infographic-pyasyncio *::before,.infographic-pyasyncio *::after{box-sizing:border-box;}
.infographic-pyasyncio .aq-wrap{padding:0 clamp(1rem,4vw,2rem) 1.5rem;}
.infographic-pyasyncio h1{font-family:var(--display-font);font-weight:600;font-size:clamp(1.4rem,5vw,1.9rem);text-align:center;margin:1.5rem 0 0.25rem;letter-spacing:-0.01em;}
.infographic-pyasyncio .aq-sub{text-align:center;color:var(--ink-soft);font-size:0.85rem;margin:0 0 1.3rem;}
.infographic-pyasyncio .code-block{font-family:var(--mono-font);font-size:0.78rem;line-height:1.75;white-space:pre;background:var(--paper-alt);border:1px solid var(--line);border-radius:8px;padding:0.85rem 1rem;margin-bottom:1.1rem;}
.infographic-pyasyncio .code-block .kw{color:var(--accent);font-weight:700;}
.infographic-pyasyncio .code-block .aio{font-weight:700;color:#9333ea;}
.infographic-pyasyncio[data-theme="dark"] .code-block .aio{color:#c58af2;}
.infographic-pyasyncio .code-block .cm{color:var(--ink-soft);}
.infographic-pyasyncio .ln{border-radius:4px;padding:0.03rem 0.15rem;transition:background .3s,box-shadow .3s;}
.infographic-pyasyncio .ln.is-on{background:var(--accent-soft);box-shadow:0 0 0 1.5px var(--accent);}
.infographic-pyasyncio .task-row{display:flex;align-items:center;gap:0.7rem;margin-bottom:0.6rem;}
.infographic-pyasyncio .task-label{font-family:var(--mono-font);font-size:0.8rem;width:110px;flex:none;color:var(--ink);}
.infographic-pyasyncio .task-track{flex:1;height:18px;background:var(--paper-alt);border:1px solid var(--line);border-radius:999px;overflow:hidden;}
.infographic-pyasyncio .task-fill{height:100%;width:0%;background:var(--accent);border-radius:999px;transition:width linear;}
.infographic-pyasyncio .task-fill.is-done{background:var(--ok);}
.infographic-pyasyncio .task-time{font-family:var(--mono-font);font-size:0.68rem;color:var(--ink-soft);width:30px;text-align:right;flex:none;}
.infographic-pyasyncio .run-row{display:flex;justify-content:center;align-items:center;gap:1rem;margin:1rem 0 0.7rem;}
.infographic-pyasyncio .run-btn{font:inherit;font-family:var(--mono-font);font-size:0.85rem;font-weight:700;background:var(--accent);color:#fff;border:none;border-radius:999px;padding:0.55rem 1.2rem;cursor:pointer;}
.infographic-pyasyncio .run-btn:disabled{opacity:0.5;cursor:default;}
.infographic-pyasyncio .stopwatch{font-family:var(--display-font);font-size:1.3rem;font-weight:600;color:var(--accent);}
.infographic-pyasyncio .device{--ed-bg:#1e1e1e;--ed-bar:#2d2d2d;--ed-text:#d4d4d4;--ed-soft:#8a8a8a;--ed-ok:#6fdc8c;background:var(--ed-bg);border:1px solid var(--line);border-radius:8px;overflow:hidden;}
.infographic-pyasyncio .device-bar{display:flex;align-items:center;gap:0.4rem;background:var(--ed-bar);padding:0.5rem 0.7rem;border-bottom:1px solid #3a3a3a;font-size:0.72rem;color:var(--ed-soft);font-weight:600;}
.infographic-pyasyncio .device-bar .dot{width:9px;height:9px;border-radius:50%;background:#5a5a5a;}
.infographic-pyasyncio .device-bar .dot:nth-child(1){background:#ff5f56;}
.infographic-pyasyncio .device-body{padding:0.75rem 0.9rem;font-family:var(--mono-font);font-size:0.78rem;color:var(--ed-text);min-height:90px;max-height:170px;overflow-y:auto;}
.infographic-pyasyncio .log-line{line-height:1.7;opacity:0;animation:aq-fadein .25s ease forwards;}
@keyframes aq-fadein{from{opacity:0;}to{opacity:1;}}
.infographic-pyasyncio .log-empty{color:var(--ed-soft);}
.infographic-pyasyncio .aq-caption{text-align:center;font-size:0.85rem;color:var(--ink-soft);margin-top:0.9rem;}
@media (prefers-reduced-motion:reduce){.infographic-pyasyncio *,.infographic-pyasyncio *::before,.infographic-pyasyncio *::after{animation-duration:.001ms!important;transition-duration:.001ms!important;}}
</style>
<div class="aq-wrap">
<h1>asyncio.create_task()</h1>
<p class="aq-sub">A task starts running the instant you create it β awaiting it later just collects the result.</p>
<div class="code-block"><span class="kw">async def</span> main():
task1 = <span class="aio">asyncio.create_task(</span>make_coffee()<span class="aio">)</span> <span class="cm"># starts NOW</span>
task2 = <span class="aio">asyncio.create_task(</span>make_toast()<span class="aio">)</span> <span class="cm"># starts NOW too</span>
<span class="ln" id="lnPrint">print("Both started β doing other things...")</span>
coffee = <span class="ln" id="lnAwait1"><span class="kw">await</span> task1</span>
toast = <span class="ln" id="lnAwait2"><span class="kw">await</span> task2</span></div>
<div class="task-row">
<span class="task-label">β task1</span>
<div class="task-track"><div class="task-fill" id="fillCoffee"></div></div>
<span class="task-time">2.0s</span>
</div>
<div class="task-row">
<span class="task-label">π task2</span>
<div class="task-track"><div class="task-fill" id="fillToast"></div></div>
<span class="task-time">1.5s</span>
</div>
<div class="run-row">
<button class="run-btn" id="runBtn">βΆ Run main()</button>
<span class="stopwatch" id="stopwatch">0.0s</span>
</div>
<div class="device">
<div class="device-bar"><span class="dot"></span><span class="dot"></span><span class="dot"></span> Terminal</div>
<div class="device-body" id="aqLog"><div class="log-empty">Hit Run β watch both bars start before a single await runs.</div></div>
</div>
<p class="aq-caption">Notice: both bars start moving before "Both started..." even prints β create_task() doesn't wait for anything.</p>
</div>
<script>
(function(){
var root = document.currentScript.closest('.infographic-pyasyncio') || document.querySelector('.infographic-pyasyncio');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark = bodyAttr === 'true' ? true : bodyAttr === 'false' ? false : (document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/) || [])[1] === 'true';
if (dark) root.setAttribute('data-theme', 'dark');
var runBtn = root.querySelector('#runBtn');
var stopwatch = root.querySelector('#stopwatch');
var aqLog = root.querySelector('#aqLog');
var fills = { coffee: root.querySelector('#fillCoffee'), toast: root.querySelector('#fillToast') };
var durations = { coffee: 2000, toast: 1500 };
var lnPrint = root.querySelector('#lnPrint');
var lnAwait1 = root.querySelector('#lnAwait1');
var lnAwait2 = root.querySelector('#lnAwait2');
var allLines = [lnPrint, lnAwait1, lnAwait2];
var running = false;
var swInterval = null;
var firstLog = true;
function logLine(text) {
if (firstLog) { aqLog.innerHTML = ''; firstLog = false; }
var line = document.createElement('div');
line.className = 'log-line';
line.textContent = text;
aqLog.appendChild(line);
aqLog.scrollTop = aqLog.scrollHeight;
}
function resetAll() {
Object.keys(fills).forEach(function (k) {
var el = fills[k];
el.style.transition = 'none';
el.style.width = '0%';
el.classList.remove('is-done');
void el.offsetWidth;
el.style.transition = '';
});
allLines.forEach(function (l) { l.classList.remove('is-on'); });
stopwatch.textContent = '0.0s';
firstLog = true;
aqLog.innerHTML = '';
}
function startTaskBar(key) {
var el = fills[key];
el.style.transitionDuration = (durations[key] / 1000) + 's';
requestAnimationFrame(function () { el.style.width = '100%'; });
}
function whenTaskDone(key, cb) {
setTimeout(function () { fills[key].classList.add('is-done'); if (cb) cb(); }, durations[key]);
}
runBtn.addEventListener('click', function () {
if (running) return;
running = true;
runBtn.disabled = true;
resetAll();
var start = performance.now();
swInterval = setInterval(function () {
stopwatch.textContent = ((performance.now() - start) / 1000).toFixed(1) + 's';
}, 100);
var coffeeDone = false, toastDone = false;
whenTaskDone('coffee', function () { coffeeDone = true; });
whenTaskDone('toast', function () { toastDone = true; });
// both tasks start immediately
logLine('task1 = asyncio.create_task(make_coffee())');
startTaskBar('coffee');
logLine('task2 = asyncio.create_task(make_toast())');
startTaskBar('toast');
setTimeout(function () {
lnPrint.classList.add('is-on');
logLine('Both started β doing other things...');
setTimeout(function () { lnPrint.classList.remove('is-on'); }, 300);
}, 250);
setTimeout(function () {
lnAwait1.classList.add('is-on');
logLine('await task1 ' + (coffeeDone ? '(already done β instant)' : '(still finishing...)'));
}, 500);
function afterCoffee() {
lnAwait1.classList.remove('is-on');
logLine('β coffee ready');
lnAwait2.classList.add('is-on');
logLine('await task2 ' + (toastDone ? '(already done β instant)' : '(still finishing...)'));
function afterToast() {
lnAwait2.classList.remove('is-on');
logLine('β toast ready');
clearInterval(swInterval);
stopwatch.textContent = ((performance.now() - start) / 1000).toFixed(1) + 's';
running = false;
runBtn.disabled = false;
}
if (toastDone) afterToast();
else whenTaskDone('toast', afterToast);
}
if (coffeeDone) afterCoffee();
else whenTaskDone('coffee', afterCoffee);
});
})();
</script>
</div>