В чем разница между асинхронностью и параллелизмом?

«В чем разница между асинхронностью и параллелизмом?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Асинхронность — это стиль программирования, при котором выполнение задачи не блокирует текущий поток до её завершения. Позволяет продолжить работу, а результат будет обработан позже (через callback, делегат или await). Относится к управлению потоком выполнения.

Параллелизм — это способ выполнения, при котором две или более задач выполняются физически одновременно на разных вычислительных единицах (ядрах CPU). Относится к исполнению.

Проще: Асинхронность — «запусти и забудь, результат придет позже». Параллелизм — «делаем несколько дел в один момент времени».

Примеры в Swift:

1. Асинхронность (с GCD):

// Не блокируем главный поток на время сетевого запроса
DispatchQueue.global().async {
    let data = fetchDataFromNetwork() // Долгая операция
    // Возвращаем результат в главный поток для обновления UI
    DispatchQueue.main.async {
        updateUI(with: data)
    }
}
// Код здесь выполняется НЕМЕДЛЕННО, не дожидаясь fetchDataFromNetwork

2. Параллелизм (с concurrentPerform):

// Физически параллельное выполнение итераций на доступных ядрах
let array = [1, 2, 3, 4, 5]
var results = [Int](repeating: 0, count: array.count)

DispatchQueue.concurrentPerform(iterations: array.count) { index in
    // Каждая итерация может выполняться на отдельном ядре
    results[index] = array[index] * 2
}
print(results) // [2, 4, 6, 8, 10]

3. Современный Swift (async/await):

// Асинхронная функция не блокирует поток
func loadData() async throws -> Data {
    let url = URL(string: "https://api.example.com/data")!
    // `await` означает «приостановись здесь, но не блокируй поток»
    let (data, _) = try await URLSession.shared.data(from: url)
    return data
}

Task {
    let data = try await loadData() // Асинхронный вызов
    // Обработка данных...
}

Связь: Асинхронные задачи могут быть выполнены параллельно, если система это позволяет, но не обязаны. Параллельные задачи часто координируются с помощью асинхронных примитивов.