iOS Sémaphore d'expédition


Exemple

DispatchSemaphore fournit une implémentation efficace d'un sémaphore de comptage traditionnel, qui peut être utilisé pour contrôler l'accès à une ressource dans plusieurs contextes d'exécution.

Un scénario pour savoir quand utiliser un sémaphore peut être si vous faites de la lecture / écriture de fichiers, si plusieurs tâches essaient de lire et d’écrire en même temps, cela peut augmenter vos performances pour que chaque tâche attende son tour. pour ne pas surcharger le contrôleur d'E / S.

Swift 3

func do2TasksAtATime () {
    print("starting long running tasks (2 at a time)")
    let sem = DispatchSemaphore(value: 2)            //this semaphore only allows 2 tasks to run at the same time (the resource count)
    for i in 0...7 {                                 //launch a bunch of tasks
        DispatchQueue.global().async {               //run tasks on a background thread
            sem.wait()                               //wait here if no resources available
            sleep(2)                                 //do some long task eg file access (here we are just sleeping for a 2 seconds for demonstration purposes)
            print("long task \(i) done! \(Date())")
            sem.signal()                             //let the semaphore know this resource is now available
        }
    }
}

Exemple de sortie: (notez les horodatages)

starting long running tasks (2 at a time)
long task 0 done! 2017-02-16 07:11:53 +0000
long task 1 done! 2017-02-16 07:11:53 +0000
long task 2 done! 2017-02-16 07:11:55 +0000
long task 3 done! 2017-02-16 07:11:55 +0000
long task 5 done! 2017-02-16 07:11:57 +0000
long task 4 done! 2017-02-16 07:11:57 +0000
long task 6 done! 2017-02-16 07:11:59 +0000
long task 7 done! 2017-02-16 07:11:59 +0000

Pour plus d'informations, consultez le document Apple Docs