2017-01-16 4 views
1

Problem: Wenn ich diesem tutorial folge, habe ich den 2 Warteschlangen unterschiedliche QoS zugewiesen. Wenn ich den Code ausführte, verhalten sich die Warteschlangen jedoch so, als hätten sie dieselbe Priorität. Ferner drucken die blauen Punkte vor den roten Punkten, obwohl die roten Punkte zuerst genannt werden. Ich habe den Code auf der completed project von der Anleitung zur Verfügung gestellt.Warteschlangen, die der QoS-Priorität nicht folgen

Hinweis: Einmal, als ich die App auf dem Simulator gelöscht und die App erneut ausgeführt habe, bekam ich eine output, die sehr nah an den Tutorials war. Aber nachdem ich den Code erneut ausgeführt habe, habe ich die Ausgabe unten erhalten. Selbst wenn ich die App erneut lösche und erneut laufe, liefere ich die gleiche Ausgabe.

-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) 
     } 
    } 
} 

Meine Leistung:

enter image description here

Tutorial der Ausgabe:

enter image description here

+0

Die Qualität der Dienstleistung wird dazu neigen, die Warteschlange mit höherer Priorität (insbesondere wenn sie in hohen Konkurrenzsituationen) bevorzugen, aber es garantiert wird nicht alle höheren qos Blöcke laufen, bevor sie den unteren qos beginnt . – Rob

+0

"Außerdem werden die blauen Punkte vor den roten Punkten gedruckt, obwohl die roten Punkte zuerst aufgerufen werden." Wenn Sie das für relevant halten, haben Sie "asynchron" nicht verstanden. – matt

Antwort

2

Das ist ein ziemlich schlecht konstruiertes Tutorial. Ich würde so empfehlen Umschreiben:

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) 
     } 
    } 
} 

Ich habe zwei Änderungen vorgenommen:

  • ich die Warteschlangen Persistenz gegeben haben, sie als Beispiel Eigenschaften verkörpert eher als Einheimische;

  • und ich habe NSLog statt print verwendet, weil print notorisch nicht Thread-sicher ist, so dass genau das, was Sie gerade versuchen zu lernen, ist das, was Sie nicht genau erfahren.

Wenn ich build-and-run, bekomme ich immer wieder so etwas wie dieses:

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 

Das viel realistischer scheint: wir einen Thread über eine andere bevorzugen, aber wir laufen nicht ein Thread ausschließlich über den anderen. Ich würde vorschlagen, dass das Ergebnis des Tutorials (und wahrscheinlich Ihr Ergebnis) nur ein Produkt der nachlässigen Codierung ist.

+0

Ich habe Ihren Code einige Male ausgeführt, und ich habe Folgendes erhalten: https://postimg.org/image/yf8mlt4gh/. Das System behandelt sie immer noch so, als hätten sie die gleiche Priorität. – 14wml

+1

Versuchen Sie es auf einem Gerät, vielleicht? Möglicherweise ist der Simulator kein sehr guter Ort, um etwas zu erforschen, das so hardware-empfindlich ist ... Auch dann könnte es vom Gerätetyp abhängen. Ich wäre nicht überrascht, unterschiedliche Ergebnisse auf einem Single-Core- gegenüber einem Double-Core-Gerät zu erzielen ... – matt

0

QoS weist CPU-Priorität nicht direkt Aufgaben zu. Wenn Sie eine QoS zuweisen, geben Sie ihre Wichtigkeit an, aber das System priorisiert es für sich.

Ich bekomme die gleichen Ergebnisse wie Sie, aber wenn ich die QoS-Klasse von utility zu background ändern, wird die höhere Priorität zuerst und die Hintergrundaufgabe später verarbeitet. Hier ist mein modifiziertes Beispiel (blau ist höhere Priorität - userInitiated, rot ist background jetzt.

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

Verwandte Themen