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 ξεκινούν μόνο μετά την ολοκλήρωση της Εργασίας φράγματος.