Compare

Side-by-side on the decisions that recur: process vs thread, threads vs async, mutex vs semaphore, blocking vs non-blocking I/O, container vs VM — with when to choose each.

ConcurrencyParallelism
DefinitionSeveral tasks in progress, interleaved over timeSeveral tasks executing at the same instant on different cores
Needs multiple coresNo — one core interleaves via time slices or an event loopYes, by definition
What it buysResponsiveness and overlap of waiting (I/O) with workThroughput: N cores can finish CPU-bound work up to N× faster
Where the OS provides itThe scheduler’s time slicing; blocking I/O releasing the coreMultiple runnable threads placed on multiple cores
Runtime realityNode’s event loop is concurrent, not parallel; CPython threads are concurrent, parallel only outside the GILC++ threads, Python multiprocessing, Node worker threads / cluster
Typical misreading"It is async so it uses all my cores" — it does not"Eight threads so eight times faster" — only if the work is CPU-bound and independent
Choose this whenThe problem is waiting: the tasks spend most of their time blocked on network, disk or users.The problem is computing: the tasks are CPU-bound, divisible, and you have idle cores.