Sobes.tech
Middle+

Τι συμβαίνει με την παράλληλη ουρά κατά την εκκίνηση μιας λειτουργίας φράχτη;

sobes.tech AI

Απάντηση από AI

Η παράλληλη ουρά γίνεται προσωρινά διαδοχική. Οι εργασίες που εκτελούνται πριν από το φράγμα ολοκληρώνονται, και στη συνέχεια εκτελείται μόνο η εργασία του φράγματος. Νέες εργασίες δεν ξεκινούν μέχρι να ολοκληρωθεί η εργασία του φράγματος. Μετά την ολοκλήρωση της εργασίας του φράγματος, η ουρά επανέρχεται σε παράλληλη εκτέλεση για τις υπόλοιπες εργασίες.

Παράδειγμα χρήσης async/await με ένα φράγμα βασισμένο σε actor:

actor SharedDataManager {
    private var data: [String] = ["Initial"]

    func addData(_ item: String) { // Μεταβλητή μέθοδος - φράγμα
        data.append(item)
        print("Προστέθηκε \(item). Τρέχοντα δεδομένα: \(data)")
    }

    func processData(completion: @escaping ([String]) -> Void) { // Μη μεταβλητή
        // Δεν απαιτεί φράγμα, μπορεί να εκτελεστεί παράλληλα με άλλα μη μεταβλητά
        DispatchQueue.global().async {
            // Εντατική επεξεργασία...
            let result = self.data.map { $0.uppercased() }
            completion(result)
        }
    }

    func getData() -> [String] { // Μη μεταβλητή μέθοδος - όχι φράγμα
        return data
    }
}

Παράδειγμα χρήσης του Grand Central Dispatch (GCD) με ένα φράγμα:

let concurrentQueue = DispatchQueue(label: "com.example.concurrentQueue", attributes: .concurrent)

func performTasks() {
    concurrentQueue.async {
        print("Εργασία 1 ξεκίνησε")
        Thread.sleep(forTimeInterval: 1) // Προσομοίωση εργασίας
        print("Εργασία 1 τελείωσε")
    }

    concurrentQueue.async {
        print("Εργασία 2 ξεκίνησε")
        Thread.sleep(forTimeInterval: 1)
        print("Εργασία 2 τελείωσε")
    }

    // Εργασία φράγματος
    concurrentQueue.async(flags: .barrier) {
        print("Εργασία φράγματος ξεκίνησε")
        Thread.sleep(forTimeInterval: 2) // Προσομοίωση εργασίας που απαιτεί αποκλειστική πρόσβαση
        print("Εργασία φράγματος τελείωσε")
    }

    // Άλλες εργασίες
    concurrentQueue.async {
        print("Εργασία 3 ξεκίνησε")
        Thread.sleep(forTimeInterval: 1)
        print("Εργασία 3 τελείωσε")
    }

    concurrentQueue.async {
        print("Εργασία 4 ξεκίνησε")
        Thread.sleep(forTimeInterval: 1)
        print("Εργασία 4 τελείωσε")
    }
}

// Η έξοδος θα δείξει ότι οι Εργασία 3 και Εργασία 4 ξεκινούν μόνο μετά την ολοκλήρωση της Εργασίας φράγματος.