Asynchronous programming
Asynchronous programming is when a computer program manages two or more tasks simultaneously, but those tasks or events do not necessarily execute at exactly the same time, ie. they are not synchronous.
Concurrency and parallelism are different solutions to achieving asynchronous operations. Sometimes, the operations are not truly asynchronous at all, but are really deferred operations; they are handled by the main thread but only after the program has returned its response to the user or client.
In JavaScript, for example, async operations are concurrent ones that are implemented using promise-based APIs. They are ideal for waiting on input or responses from external systems or users, without blocking other processing on the main thread in the meantime.
Asynchronous programming specifically refers to any design pattern in which some tasks are somehow separated from the main thread of execution of a computer program, such that the asynchronous tasks are non-blocking of the main thread, but are still processed by the same [node].
Asynchronous communication is a related concept, but refers specifically to any method of exchanging messages between [nodes], in which the sending, receiving, and processing of each message is not dependent upon the sending, receipt, or processing of other messages. For example, messages may be sent without waiting for a response or even acknowledgement, and receivers may process messages after they have been received, and perhaps in any order. Email is the classic example of asynchronous communication.
Asynchronous processing of data may be implemented through either asynchronous execution within a computer program, or asynchronous message passing between programs running on multiple systems.