iOS Files d'attente de répartition série / simultanée


Exemple

Swift 3

File d'attente série

func serialQueues () {
    let serialQueue = DispatchQueue(label: "com.example.serial") //default queue type is a serial queue
    let start = Date ()
    for i in 0...3 {                                             //launch a bunch of tasks
        serialQueue.async {                                      //run tasks on a background thread, using our serial queue
            sleep(2)                                             //do some long task eg webservice or database lookup
            let timeTaken = Date().timeIntervalSince(start)
            print("serial long task \(i) done! total time taken: \(timeTaken)")
        }
    }
}

Exemple de sortie:

serial long task 0 done! total time taken: 2.07241100072861
serial long task 1 done! total time taken: 4.16347700357437
serial long task 2 done! total time taken: 6.23209798336029
serial long task 3 done! total time taken: 8.30682599544525

File d'attente simultanée

func concurrentQueues () {
    let concurrentQueue = DispatchQueue(label: "com.example.concurrent", attributes: .concurrent) //explicitly specify the queue to be a concurrent queue
    let start = Date ()
    for i in 0...3 {            //launch a bunch of tasks
        concurrentQueue.async { //run tasks on a background thread, using our concurrent queue
            sleep(2)            //do some long task eg webservice or database lookup
            let timeTaken = Date().timeIntervalSince(start)
            print("concurrent long task \(i) done! total time taken: \(timeTaken)")
        }
    }
}

Exemple de sortie:

concurrent long task 3 done! total time taken: 2.07092100381851
concurrent long task 0 done! total time taken: 2.07087397575378
concurrent long task 2 done! total time taken: 2.07086700201035
concurrent long task 1 done! total time taken: 2.07089096307755

Discussion

Comme nous pouvons le voir dans les exemples ci-dessus, une file d'attente série complète chaque tâche dans l'ordre dans lequel elles sont soumises à la file d'attente. Chaque tâche attend que la tâche précédente se termine avant de l'exécuter. En ce qui concerne la file d'attente concurrente, chaque tâche n'attend pas les autres en attente et s'exécute dès que possible. L'avantage est que toutes les tâches de la file d'attente s'exécuteront en même temps sur des threads distincts, ce qui fait qu'une file d'attente simultanée prend moins de temps qu'une file d'attente en série.

Si l'ordre d'exécution des tâches n'est pas important, utilisez toujours une file d'attente simultanée pour optimiser l'efficacité.