Concurrency is about structure: several tasks are in progress during the same period, and they take turns. Parallelism is about execution: several tasks run at the same instant, on different CPU cores. Rob Pike’s talk “Concurrency is not parallelism” (2012) is the classic explanation.

A cook with three pots on the stove, stirring each in turn, is concurrent. Three cooks each stirring one pot is parallel.

Where you meet it

SetupConcurrent?Parallel?
JavaScript with the event loopYes: many requests in flightNo: your code runs on one thread
Python threads (standard CPython)YesNot for Python bytecode: the GIL lets one thread run at a time
Python multiprocessing, Java threads, Go goroutines on many coresYesYes
A Web Worker next to the main threadYesYes

Why it matters

  • Waiting-bound work (network, disk): concurrency is enough. While one task waits, another runs.
  • CPU-bound work (maths, parsing, image processing): you need parallelism, meaning more cores doing real work.

Choosing the wrong one is a classic interview trap: adding threads to a CPU-heavy Python loop makes it no faster.

Check yourself