Что такое Thread Explosion в iOS-разработке?

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

Ответ

Thread Explosion — это ситуация, когда приложение создаёт чрезмерное количество потоков, превышающее возможности системы, что приводит к деградации производительности.

Основные причины:

  • Неконтролируемое использование DispatchQueue.global() для запуска множества параллельных задач.
  • Рекурсивные или вложенные асинхронные вызовы, каждый из которых порождает новый поток.
  • Использование sync вызовов на concurrent очередях, что может приводить к блокировкам и созданию дополнительных потоков для избежания deadlock.

Последствия:

  • Высокая нагрузка на CPU из-за частого переключения контекста между потоками.
  • Увеличение потребления памяти (каждый поток имеет свой стек).
  • Рост задержек (latency) и возможные краши из-за исчерпания системных ресурсов.

Решение и best practices:

  1. Используйте ограниченные очереди. Вместо неограниченной глобальной очереди создавайте свои с явным указанием типа (concurrent или serial).
  2. Контролируйте параллелизм через OperationQueue. Установите maxConcurrentOperationCount для ограничения количества одновременно выполняемых задач.
  3. Применяйте шаблоны, такие как пул потоков или семафоры (DispatchSemaphore), для регулирования нагрузки.

Пример плохого и хорошего кода:

// ❌ Плохо: Риск Thread Explosion
for i in 0..<1000 {
    DispatchQueue.global().async {
        performHeavyTask(index: i)
    }
}

// ✅ Лучше: Контролируемый параллелизм
let processingQueue = OperationQueue()
processingQueue.maxConcurrentOperationCount = ProcessInfo.processInfo.activeProcessorCount // Ограничение по числу ядер

for i in 0..<1000 {
    processingQueue.addOperation {
        performHeavyTask(index: i)
    }
}