Parallel = truly simultaneous on multi-core. Concurrent = fast switching on one core.

Processes: isolated memory, safer; heavier switches; IPC cost.
Threads: share memory; cheaper context switch; risk of race/deadlock.
Coroutines: user‑space scheduled lightweight threads; cooperative yielding.

Coroutine sample (PHP generator):

function echoTimes($msg, $max) {
for ($i=1; $i <= $max; $i++) { echo "$msg iteration $i\n"; yield; }
}
function task1(){ yield from echoTimes('bar',5); }

For multi-core combine multi-process + coroutine for throughput.