The actual scheduling of tasks is delegated to an executor: https://github.com/DougGregor/swift-evolution/blob/structured-concurrency/proposals/nnnn-structured-concurrency.md#executors
So the actual flavor of concurrency will depend on both the async method, and the executor. The phrasing prefers "concurrency" over "parallelism", for multiple reasons:
- As a consumer of an
async
methods with theawait
keyword (orasync let
), the language wants you to think about concurrency more than parallelism or threads (lexicon). For example, an async method is allowed to execute and return synchronously. An async method is allowed to schedule some little jobs on the main RunLoop (think I/O). An async method is allowed to spawn a new thread, or use libDispatch, or use other facilities provided by the new Task and Actor apis. async/await
are more fundamental than Structured concurrency and Actors, which will, I guess, answer your questions with more details.- I expect that "don't mismatch
DispatchQueue.async
with Swift'sasync
" will soon become a mantra, and a key step in the discovery of the new concurrency features.