Ответ
Serial DispatchQueue выполняет задачи строго по очереди, одна за другой. Concurrent DispatchQueue может запускать несколько задач одновременно, используя доступные потоки системы.
Ключевые отличия:
- Порядок выполнения: Serial гарантирует FIFO (First-In-First-Out) порядок задач. Concurrent обеспечивает порядок только начала задач, но не их завершения.
- Производительность: Concurrent может повысить производительность за счет параллелизма на многоядерных системах.
- Безопасность потоков: Serial по своей природе потокобезопасна для доступа к общему ресурсу из своих задач. Concurrent требует явной синхронизации (барьеры, блокировки).
Пример создания очередей:
// Последовательная очередь (по умолчанию)
let serialQueue = DispatchQueue(label: "com.app.serialQueue")
// Параллельная очередь
let concurrentQueue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent)
// Использование
serialQueue.async {
print("Task 1 on serial queue")
}
concurrentQueue.async {
print("Task A on concurrent queue")
}
Когда использовать:
- Serial: Для задач, требующих строгого порядка или работы с общим ресурсом без сложной синхронизации.
- Concurrent: Для независимых, ресурсоемких задач, которые можно выполнять параллельно (например, обработка изображений).