2017-02-08 17 views
1

Когда я запускаю следующую площадку я замечаю, что по умолчанию очередь отправки кажется последовательной очереди называется OS_dispatch_queue_serial.Swift 3: Почему OS_dispatch_queue_serial - очередь по умолчанию?

Почему?

В этом контексте я запутался семантическое использование асинхронного и синхронизации, так как в этом случае они, кажется, ведут себя как синхронно, так и последовательно.

Я не прав? Я запутываю серийность с синхронизацией?

enter image description here

Перед запуском кода я ожидал, чтобы достичь следующего:

Hello World 
Hello Moon 

world * (or Moon) 
Moon * (or world) 
// Note: here I assumed that async meant that the codes in the block would have been run in parallel to each other and that this would have meant that either world or Moon would have been printed depending on **race conditions** 

Hello World 
world 
Hello Moon 
Moon 

площадка код:

import Foundation 
import PlaygroundSupport 

PlaygroundPage.current.needsIndefiniteExecution = true 

let queue = DispatchQueue(label: "com.test.myqueue") 

queue.async { 
    print("Hello World") 
    sleep(2) 
    print("world") 
} 
queue.async { 
    print("Hello Moon") 
    sleep(1) 
    print("Moon") 
} 

queue.sync { 
    print("Hello World") 
    sleep(2) 
    print("world") 
} 

queue.sync { 
    print("Hello Moon") 
    sleep(1) 
    print("Moon") 
} 

Любая помощь понимание этого быстрее было бы здорово.

ответ

2

Вы объединяете синхронные и асинхронные и последовательные и параллельные. Они ортогональны. Позвольте мне увидеть, если я могу это объяснить:

Синхронный и асинхронный описывают поведение блоков относительно установлен в очереди к Епдиеих-эр.

Последовательный и параллельных описывают поведение блоков относительно установлено в очередь, чтобы друг с другом.

Последовательная очередь выполняет блоки, выделенные ему по одному за раз. Это верно независимо от того, были ли блокированы синхронно или асинхронно.

Параллельная очередь выполняет вещи, помеченные ей N за раз, где N возможно (но не обязательно) больше 1. Это верно, независимо от того, были ли блокированы синхронно или асинхронно.

Если вы помещаете в блок синхронно, поток очереди остается остановленным до завершения выполнения блока (возможно, в другом потоке). Это верно независимо от того, является ли очередь последовательной или параллельной.

Если вы епдиеий блок асинхронно, то enqueuing нить продолжается, и блок выполняется (скорее всего, в другом потоке) некоторое количество времени позже, возможно, в то время как код на enqueuing нити все еще работают. Это верно независимо от того, является ли очередь последовательной или параллельной.

Что касается того, почему серийный номер по умолчанию, сказать сложно, но я предполагаю, что это потому, что «последовательная очередь» больше соответствует определению словаря «очередь».

+1

Первоначально (IOS 4/OS X 10.6) можно не создавать параллельные очереди в ГКД. Были системные параллельные очереди, но вы больше не могли создавать. В iOS 4.3/OS X 10.7 они добавили возможность создавать параллельные очереди, но сохраняли серийные очереди по умолчанию. На практике я редко встречался с обычными параллельными очередями, обычно при реализации шаблона производителя/потребителя (https://github.com/iosptl/ios7ptl/blob/master/ch23-AdvGCD/ProducerConsumer/ProducerConsumer/ViewController.m) , Обычно достаточно системы. Обычно, когда вы создаете пользовательскую очередь, это сериализовать доступ. –

+1

(даже в приведенном выше примере действительно не нужна индивидуальная параллельная очередь, это было бы хорошо с одной из системных очередей, поэтому это все реже, чем это ...: D Но многие из вещей, которые вы используете для очереди с очередью, это не будет сделано, если вы не сможете создать пользовательский вариант.) –

2

Очереди бывают двух видов:

  • Serial - Запускает блоки один за один раз
  • Параллельное - Runs блоки более чем по одному

диспетчеризацию блоков в очереди в двух ароматы:

  • sync - сделайте это прямо сейчас я буду ждать
  • async - сделайте это позже, некоторое время.

Так что в вашем примере вы создаете очередность очереди (выполняется только по одному блоку за раз). Затем вы отправляете 4 блока в эту очередь. Некоторые из них запускаются в некоторый момент (асинхронный), а некоторые из них выполняются немедленно (синхронизация). Но поскольку очередь является серийной, вы запускаете только одну из них за раз. Таким образом, на приведенной ниже иллюстрации последовательная очередь завершит блок 1, прежде чем он запустит блок 2. Параллельная очередь запускает блок 1 и блок 2 одновременно, и оба они запускаются одновременно.

Illustration of serial vs concurrent queues

+0

Итак, последовательные очереди используют FIFO и несерийные очереди (параллельные), используя критерии случайного выполнения? (например, немного блока кода 1, немного кода 2). – mm24

+0

См. изображение, которое я добавил. Одновременные очереди не чередуются или не чередуют блоки 1 и 2, они одновременно выполняют оба блока независимо друг от друга. –