В чем разница между параллельной очередью отправки и последовательной очередью отправки

я реализую следующий класс:

class GCDStudy {

    func asyncSerial(time:Double){
        let queue = dispatch_queue_create("DISPATCH_QUEUE_SERIAL",DISPATCH_QUEUE_SERIAL)

        dispatch_async(queue){

            var i:Double = 0
            while(i < 3){
                i++
                print("asyncSerial -wait:(time)-(i)")

            }
        }

    }

    func asyncConcurrent(time:Double){

        let queue = dispatch_queue_create("DISPATCH_QUEUE_CONCURRENT",DISPATCH_QUEUE_CONCURRENT)

        dispatch_async(queue){
            var i:Double = 0
            while(i < 3){
                i++
                print("asyncConcurrent -wait:(time)-(i)")
            }
        }
    }
}

и выполните следующие действия:

Запуск:

gCDStudy = GCDStudy()
gCDStudy.asyncSerial(1)
gCDStudy.asyncSerial(2)

Запустить B

vgCDStudy2 = GCDStudy()
gCDStudy2.asyncConcurrent(1)
gCDStudy2.asyncConcurrent(2)

и результат RunA:

asyncSerial -wait:1.0-1.0
asyncSerial -wait:2.0-1.0
asyncSerial -wait:1.0-2.0
asyncSerial -wait:2.0-2.0
asyncSerial -wait:1.0-3.0
asyncSerial -wait:2.0-3.0

результат RunB:

asyncSerial -wait:1.0-1.0
asyncSerial -wait:2.0-1.0
asyncSerial -wait:1.0-2.0
asyncSerial -wait:2.0-2.0
asyncSerial -wait:1.0-3.0
asyncSerial -wait:2.0-3.0

эти результаты одинаковы, в чем разница между этими?

иногда эти результаты отличаются.

спасибо

1 ответов


последовательные очереди выполняют одну задачу за раз в том порядке, в котором они добавляются в очередь, тогда как параллельные очереди выполняют одну или несколько задач одновременно. Важно отметить, что даже для одновременных очередей задачи запускаются в том порядке, в котором они были добавлены в очередь. Из-за этого в вашем случае вы, вероятно, не увидите никаких изменений в выходных данных как print будет выполняться довольно быстро каждым потоком в параллельной очереди, так что будет казаться, что они были выполнены последовательно.

Если вы ожидаете увидеть разницу, возможно, вы можете попробовать обновить свой код следующим образом:

class GCDStudy {

  func asyncSerial(time: Double) {
    let queue = dispatch_queue_create("DISPATCH_QUEUE_SERIAL", DISPATCH_QUEUE_SERIAL)

    for i in 0..<3 {
      dispatch_async(queue) {
        print("asyncSerial -wait:\(time)-\(i)")
      }
    }
  }

  func asyncConcurrent(time: Double) {
    let queue = dispatch_queue_create("DISPATCH_QUEUE_CONCURRENT", DISPATCH_QUEUE_CONCURRENT)

    for i in 0..<3 {
      dispatch_async(queue) {
        print("asyncConcurrent -wait:\(time)-\(i)")
      }
    }
  }
}