2017-01-16 9 views
1

Проблема: После этого tutorial я назначил разные QoS в 2 очереди. Однако, когда я запускал код, очереди действуют так, как будто они имеют одинаковый приоритет. Кроме того, синие точки печатаются перед красными точками, даже если сначала появляются красные точки. Я запустил код на 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 напрямую не назначает приоритет ЦП для задач. Назначив 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