2017-01-16 2 views
1

Problème: En suivant ce tutorial, j'ai affecté différentes QoS aux 2 files d'attente. Cependant, lorsque j'ai exécuté le code, les files d'attente agissent comme si elles avaient la même priorité. De plus, les points bleus s'impriment avant les points rouges même si les points rouges sont appelés en premier. J'ai couru le code sur le completed project fourni par le tutoriel.Files d'attente ne suivant pas la priorité QoS

Note: Une fois, lorsque j'ai supprimé l'application sur le simulateur et que j'ai réexécuté l'application, j'ai obtenu un output qui était très proche du tutoriel. Mais après avoir réexécuté le code, j'ai eu la sortie ci-dessous. Même la suppression et la réexécution de l'application, me donne juste la même sortie.

code

override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     queuesWithQoS() 
} 

func queuesWithQoS() { 
     let queue1 = DispatchQueue(label: "com.appcoda.queue1", qos: DispatchQoS.userInitiated) 
     let queue2 = DispatchQueue(label: "com.appcoda.queue2", qos: DispatchQoS.utility) 

    queue1.async { 
     for i in 0..<10 { 
      print("", i) 
     } 
    } 

    queue2.async { 
     for i in 100..<110 { 
      print("", i) 
     } 
    } 
} 

Ma sortie:

enter image description here

de sortie Tutoriel:

enter image description here

+0

La qualité du service aura tendance à préférer la file d'attente de priorité plus élevée (en particulier lorsque dans des situations critiques de contention), mais il est pas garanti d'exécuter tous les blocs de QdS plus avant le début de la QOS inférieure . – Rob

+0

"De plus, les points bleus sont imprimés avant les points rouges même si les points rouges sont appelés en premier" Si vous pensez que cela est pertinent, vous n'avez pas compris "asynchrone". – matt

Répondre

2

C'est un tutoriel plutôt mal construit. Je suggère de réécrire comme ceci:

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    queuesWithQoS() 
} 
let queue1 = DispatchQueue(label: "com.appcoda.queue1", qos: .userInitiated) 
let queue2 = DispatchQueue(label: "com.appcoda.queue2", qos: .utility) 
func queuesWithQoS() { 
    queue1.async { 
     for i in 0..<10 { 
      NSLog("%@ %d", "", i) 
     } 
    } 
    queue2.async { 
     for i in 100..<110 { 
      NSLog("%@ %d", "", i) 
     } 
    } 
} 

J'ai fait deux changements:

  • J'ai donné les files d'attente de persistance, les incarnant comme propriétés d'instance plutôt que la population locale;

  • et je l'ai utilisé NSLog au lieu de print, parce que print est notoirement pas thread-safe donc exactement la chose que vous essayez d'apprendre est juste ce que vous ne serez pas apprendre avec précision.

Quand je construis-and-run, je reçois à plusieurs reprises quelque chose comme ceci:

2017-01-16 10:41:25.577 qosTest[3033:285702] 0 
2017-01-16 10:41:25.577 qosTest[3033:285703] 100 
2017-01-16 10:41:25.579 qosTest[3033:285702] 1 
2017-01-16 10:41:25.579 qosTest[3033:285702] 2 
2017-01-16 10:41:25.580 qosTest[3033:285702] 3 
2017-01-16 10:41:25.579 qosTest[3033:285703] 101 
2017-01-16 10:41:25.580 qosTest[3033:285702] 4 
2017-01-16 10:41:25.580 qosTest[3033:285702] 5 
2017-01-16 10:41:25.580 qosTest[3033:285703] 102 
2017-01-16 10:41:25.581 qosTest[3033:285702] 6 
2017-01-16 10:41:25.581 qosTest[3033:285702] 7 
2017-01-16 10:41:25.581 qosTest[3033:285703] 103 
2017-01-16 10:41:25.581 qosTest[3033:285702] 8 
2017-01-16 10:41:25.582 qosTest[3033:285702] 9 
2017-01-16 10:41:25.585 qosTest[3033:285703] 104 
2017-01-16 10:41:25.586 qosTest[3033:285703] 105 
2017-01-16 10:41:25.610 qosTest[3033:285703] 106 
2017-01-16 10:41:25.611 qosTest[3033:285703] 107 
2017-01-16 10:41:25.613 qosTest[3033:285703] 108 
2017-01-16 10:41:25.615 qosTest[3033:285703] 109 

Cela semble beaucoup plus réaliste: nous préférons un fil sur une autre, mais nous ne courons pas un seul fil exclusivement sur l'autre. Je suggérerais que le résultat du tutoriel (et probablement votre résultat) n'est que le fruit d'un codage imprudent. QoS n'attribue pas directement la priorité de l'UC aux tâches.

+0

J'ai couru votre code plusieurs fois et j'ai obtenu ceci: https://postimg.org/image/yf8mlt4gh/. Le système les traite toujours comme s'ils avaient la même priorité. – 14wml

+1

L'essayer sur un appareil Peut-être que le simulateur n'est pas un très bon endroit pour explorer quelque chose qui est si sensible au matériel ... Même alors, cela peut dépendre du type d'appareil. Je ne serais pas surpris d'obtenir des résultats différents sur un simple-core par rapport à un périphérique double-core ... – matt

0

En attribuant une QoS au travail, vous indique son importance, mais le système lui donne la priorité seul. Je reçois les mêmes résultats que vous, mais si je change la classe QoS de utility à background, l'élément de priorité supérieure est traité en premier et la tâche en arrière-plan plus tard. Voici mon exemple modifié (le bleu est la plus haute priorité - userInitiated, le rouge est background maintenant.

import PlaygroundSupport 
import Dispatch 

PlaygroundPage.current.needsIndefiniteExecution = true 


let queue1 = DispatchQueue(label: "queue1", qos: .background, attributes: .concurrent) 

let queue2 = DispatchQueue(label: "queue2", qos: .userInitiated, attributes: .concurrent) 

queue1.async { 
    for i in 0..<10 { 
     print("", i) 
    } 
} 

queue2.async { 
    for i in 100..<110 { 
     print("", i) 
    } 
} 

enter image description here