2017-01-16 149 views
1

問題:在跟隨此tutorial時,我爲這兩個隊列分配了不同的QoS。但是,當我運行代碼時,隊列的行爲就好像它們具有相同的優先級。此外,即使首先調用紅色點,藍色點也在紅色點之前打印。我運行了本教程提供的completed project上的代碼。不符合QoS優先級的隊列

注意:有一次,當我在模擬器上刪除應用程序並重新運行應用程序時,我得到一個非常接近教程的output。但是在再次運行代碼之後,我得到了下面的輸出。即使刪除並重新運行應用程序,只是給了我相同的輸出。

代碼

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

我的輸出:

enter image description here

教程的輸出:

enter image description here

+0

的服務質量將趨於時(尤指高位爭持的情況下),更喜歡更高的優先級隊列,但它不能保證運行所有的更高的QoS塊就開始下的QoS之前。 – Rob

+0

「此外,即使紅點被首先調用,紅點之前的藍點也會打印出來。」如果您認爲這是相關的,那麼您還沒有理解「異步」。 – matt

回答

2

這是一個相當糟糕的教程。我建議重寫這樣的:

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

我做了兩個轉變:

  • 我已經給隊列持久性,體現了他們作爲實例的屬性,而不是本地人;

  • 和我用NSLog代替print,因爲print是出了名不是線程安全的,這樣正是你正在努力學習的東西正是你不會準確地學習。

當我建立了就跑,我多次得到這樣的:

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 

這似乎更加現實:我們喜歡一個線程在另一個但我們不運行一個線程獨佔。我會建議教程的結果(也可能是你的結果)只是粗心大意的編碼。

+0

我跑了你的代碼很多次,我得到了這個:https://postimg.org/image/yf8mlt4gh/。該系統仍在對待它們,就好像它們具有相同的優先級。 – 14wml

+1

嘗試在設備上,也許?模擬器可能不是一個很好的地方去探索那些對硬件非常敏感的東西......即使這樣它也可能取決於設備類型。在單核與雙核設備上獲得不同的結果我不會感到驚訝...... – matt

0

QoS不會直接爲任務分配CPU優先級。通過分配一個QoS來工作,你表示它的重要性,但是系統本身優先考慮它的優先級

我得到的結果與您相同,但如果將QoS等級從utility更改爲background,則會優先處理較高優先級的項目,並稍後處理後臺任務。這裏是我的修改示例(藍色是更高優先級 - userInitiated,紅色現在是background

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