A programming paradigm that allows IO Operation to be performed concurrently with other tasks, without blocking the execution of the program, so the CPU can initiate multiple other I/O operations and continue executing other CPU-bounded tasks while waiting for the results