Sobes.tech
Senior

Async жана await механизмдери кандай иштейт?

sobes.tech AI

AIден жооп

Swiftтеги Async/await негизделген структураланган конкуренцияга негизделген жана Dispatch/Global Actors колдонуп жатат. Арткы планда иштеген механизмдер:

  1. Улантуу стили: Асимхрондук функциялар улантуу стилине которулат. Тез арада маанини кайтаруу ордуна, башкаруу Swift runtimeка өткөрүлөт, ал функциянын учурдагы абалын сактайт (жергиликтүү өзгөрмөлөр, аткаруу көрсөткүчү). Асимхрондук операция аяктагандан кийин, runtime функцияны сакталган абалдан калыбына келтирет.

  2. Task: Ар бир async функция чакырыгы структураланган Task түзөт же ага кошулат. Task иштин бирдигин көрсөтөт жана хиерархия түзөт. Ата-эне Task балдар Task-ларынын аяктоосун күтөт.

  3. Job: Task кичирээк иш бирдиктерине бөлүнөт, алар Job деп аталат. Job аткаруучу (Executor) аркылуу аткарылуучу код бөлүгү болуп саналат.

  4. Executor: Аткаруучу Job-ду ишке киргизүү үчүн жооптуу. Стандарттык китепканада, көпчүлүк асинхрондук тапшырмалар үчүн глобалдык DispatchQueue колдонулат. Специализацияланган контексттер (мисалы, MainActor) өзүнүн атайын аткаруучулары бар.

  5. Тартыш пункттары: await — бул токтоп турган чекит (suspension point). awaitке жеткенде, функция токтоп калат, башкаруу чакырган кодго же аткаруучуга өтөт, жана учурдагы Job аяктайт. Swift runtime функциянын абалын сактайт.

  6. Калыбына келтирүү: await күтүп жаткан асинхрондук операция аяктагандан кийин, Swift runtime жаңы Job түзөт, токтогон функцияны улантуу үчүн. Бул Job аткаруучу кезегине коюлат.

  7. Болтуроо: Структураланган конкуренция иерархиялык болтурдууну колдойт. Ата-эне Task болтурганда, ал автоматтык түрдө бардык балдар Task-ларын да болтурдууга алат. Асимхрондук операциялар болтурдуунун абалын текшере алат жана ылайык жооп кайтара алат.

Мисал катары, async функциянын компиляцияланган жөнөкөй мисалы:

// Баштапкы async функция
func fetchData() async -> Data {
    // Асимхрондук операция
    let data = await URLSession.shared.data(from: url).0
    return data
}

// Компиляциянын жөнөкөй көрүнүшү
// Вертүстү, функция Continuation кабыл алат
func fetchData(_ continuation: Continuation<Data, Error>) {
    // Функциянын баштапкы коду
    let url = URL(string: "...")! // Мисал
    
    // А asymхрондук операцияны ишке киргизүү
    URLSession.shared.data(from: url) { data, _, error in
        // Бул блок асинхрондук операция аяктагандан кийин ишке ашат
        if let data = data {
            // Натыйжаны continuationга өткөрүү, функцияны улантуу
            continuation.resume(returning: data)
        } else if let error = error {
            continuation.resume(throwing: error)
        } else {
            // Башка учурларды иштетүү
            continuation.resume(throwing: NSError(domain: "", code: 0, userInfo: nil))
        }
    }
    // Функция ушул жерден аяктайт, resume чакыруу күтүлүүдө
}

Await негизинен синтаксистик шекер болуп саналат, ал Continuation башкаруу жана Job пландаштыруу үчүн аткаруучуга үстөмдүк кылат. Токтоп калуу түз эле жипти блоктогон эмес, аткаруучу башка Job-дарды ишке ашырууга мүмкүндүк берет.