← Назад к вопросам

Что такое Concurrency?

1.0 Junior🔥 161 комментариев
#Многопоточность и асинхронность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Chto takoe Concurrency v Swift

Concurrency (Konkurentnost') - eto sposobnost' vypolnjat' neskolko zadach s perekrytiem vo vremeni. Eto ne to zhe samoe, chto Parallelism - Concurrency mozhet byt' na odnom yadern, gde zadachi chereduyutsya, a Parallelism - eto istinnyi parallel na mnogoyadernykh sistem.

Raznica: Concurrency vs Parallelism

Concurrency (1 yadernyj CPU):
Task1: ####__####__####__
Task2: __####__####__####

Parallelism (2 yadernyj CPU):
Core1: Task1 ################
Core2: Task2 ################

Concurrency - eto planirovka, Parallelism - eto vypolnenie.

Do Swift 5.5 - Opasnye callback'i

// BAD - callback hell
fetchUser { user in
    fetchPosts(for: user) { posts in
        fetchComments(for: posts) { comments in
            updateUI(with: comments)
        }
    }
}

// PROBLEMY:
// 1. Pyramid of Doom
// 2. Tyazhelo chitat'
// 3. Error handling - noj
// 4. Memory leaks - self references

Swift 5.5+ - async/await

Apple predstavila structured concurrency - novyj paradigm:

// GOOD - sequencial, no ne blokiruem poток
async {
    let user = try await fetchUser()
    let posts = try await fetchPosts(for: user)
    let comments = try await fetchComments(for: posts)
    updateUI(with: comments)
}

Async Functions

func fetchData() async -> Data {
    let url = URL(string: "api.example.com/data")
    let (data, _) = try await URLSession.shared.data(from: url)
    return data
}

// Ispol'zovanie
let data = try await fetchData()

Structured Concurrency - Task

Task - eto edinyca raboty v concurrent srede:

// SEQUENTIAL - odinim zа drugim
async {
    let user = try await fetchUser()
    let posts = try await fetchPosts(for: user)
}

// CONCURRENT - parallel'no
async {
    let userTask = Task { try await fetchUser() }
    let postsTask = Task { try await fetchPosts() }
    
    let user = try await userTask.value
    let posts = try await postsTask.value
}

// ASYNC LET - ehlegantnee
async {
    async let user = fetchUser()
    async let posts = fetchPosts()
    
    let u = try await user
    let p = try await posts
}

Task Groups - mnogo zadach

let results = try await withThrowingTaskGroup(of: Data.self) { group in
    for url in urls {
        group.addTask {
            let (data, _) = try await URLSession.shared.data(from: url)
            return data
        }
    }
    
    var results: [Data] = []
    for try await data in group {
        results.append(data)
    }
    return results
}

Actor - Safe Concurrency

Actor - tip, kторyj garantiruet thread-safety:

actor UserCache {
    private var cache: [Int: User] = [:]
    
    func get(_ id: Int) -> User? {
        cache[id]
    }
    
    func set(_ user: User) {
        cache[user.id] = user
    }
}

// Ispol'zovanie
let cacheActor = UserCache()
await cacheActor.set(user)
let cached = await cacheActor.get(user.id)

Nonisolated - break out of Actor

actor DataProcessor {
    nonisolated func logError(_ error: Error) {
        // Ne zelyayetsya na data, mozhet byt' vyzvan bez await
        print("Error: \(error)")
    }
    
    func process() async throws {
        do {
            try await doWork()
        } catch {
            nonisolated(unsafe) var shared = 0
            logError(error)
        }
    }
}

Sendable - kompiliator proverki

// SAFE - value types i immutable
struct User: Sendable {
    let id: Int
    let name: String
}

// UNSAFE - class s mutacijom
class MutableUser: Sendable {  // WARNING!
    var name: String
}

MainActor - UI Thread

@MainActor
func updateUI() {
    label.text = "Updated"
}

// Ili dlja class'a
@MainActor
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Prakticheskij primer

@MainActor
class FeedViewModel: ObservableObject {
    @Published var posts: [Post] = []
    
    func loadPosts() async {
        do {
            async let userPosts = fetchUserPosts()
            async let trending = fetchTrendingPosts()
            
            let (user, trend) = try await (userPosts, trending)
            self.posts = user + trend
        } catch {
            print("Error: \(error)")
        }
    }
}

Cancellation

let task = Task {
    try await longRunningTask()
}

Task {
    try await Task.sleep(nanoseconds: 1_000_000_000)
    task.cancel()
}

Preimushchestva Structured Concurrency

  • Type-safe - compiler proverit ves kod
  • Readable - sekvencionnyj stil
  • Automatic cancellation - deti Tasks otmeny
  • No callback hell - flat kod
  • Memory safe - ehkonomit memory

Kogda ispol'zovat'

  • Network requests - async URLSession
  • File IO - async file operations
  • Database - async database queries
  • Parallel work - Task groups
  • UI updates - MainActor

Concurrency v Swift - eto revolyuciya v sravnenii s callback'ami i GCD. Ehto bezopasnyj, chitaemyj, i efectivnyj sposob pismat' asinkhronnыj kod.

Что такое Concurrency? | PrepBro