Asynchronous Swift 3:为什么操作系统调度队列是默认队列?

Asynchronous Swift 3:为什么操作系统调度队列是默认队列?,asynchronous,swift3,queue,grand-central-dispatch,Asynchronous,Swift3,Queue,Grand Central Dispatch,当我运行以下程序时,我注意到默认调度队列似乎是一个名为OS\u dispatch\u queue\u serial的串行队列 为什么呢 在这种情况下,我对async和sync的语义用法感到困惑,因为在这种情况下,它们似乎是同步和串行的 我错了吗? 我是否混淆了连续性和同步性 在运行代码之前,我希望实现以下目标: Hello World Hello Moon world * (or Moon) Moon * (or world) // Note: here I assumed that as

当我运行以下程序时,我注意到默认调度队列似乎是一个名为OS\u dispatch\u queue\u serial的串行队列

为什么呢

在这种情况下,我对asyncsync的语义用法感到困惑,因为在这种情况下,它们似乎是同步和串行的

我错了吗? 我是否混淆了连续性和同步性

在运行代码之前,我希望实现以下目标:

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

如果你能更快地理解这一点,那就太好了。

你把同步与异步、串行与并行混为一谈了。它们是正交的。让我看看能不能解释一下:

同步和异步描述排队块相对于排队器的行为

串行和并行描述排队块相对于彼此的行为

串行队列执行一次一个排队的块。无论块是同步还是异步排队,这都是正确的

并行队列一次执行排队到它的事物N,其中N可能(但不一定)大于1。无论块是同步还是异步排队,这都是正确的

如果同步地将块排入队列,则该队列线程将停止,直到块的执行完成(可能在另一个线程上)。无论队列是串行队列还是并行队列,这都是正确的

如果以异步方式对块进行排队,则排队线程将继续,并且该块将在一段时间后执行(很可能在另一个线程上),可能是在排队线程上的代码仍在运行时执行。无论队列是串行队列还是并行队列,这都是正确的


至于为什么串行是默认值,很难说,但我猜测这是因为“串行队列”更符合“队列”一词的字典定义。

队列有两种类型:

  • 串行-一次运行一个块
  • 并发-一次运行多个块
将块分配到队列有两种方式:

  • 同步-立即执行此操作我将等待
  • 异步-稍后再做
因此,在您的示例中,您创建了一个串行队列(一次只运行一个块)。然后向该队列分配4个块。其中一些在某个点上运行(异步),另一些立即运行(同步)。但由于队列是串行的,因此一次只能运行其中一个队列。因此,在下图中,串行队列将在启动块2之前完成块1。并发队列同时启动块1和块2,它们同时运行


最初(iOS 4/OS X 10.6)无法在GCD中创建并发队列。存在系统并发队列,但您无法再创建任何队列。在iOS 4.3/OS X 10.7中,他们添加了创建并发队列的功能,但保留了串行队列作为默认队列。实际上,我很少发现定制并发队列有用,通常是在实现生产者/消费者模式()时。系统一通常是足够的。通常,在创建自定义队列时,它是用来序列化访问的。(即使是我列出的示例也不需要自定义并发队列;使用其中一个系统队列也可以,因此比这更为罕见…:D但是,如果不能够创建自定义队列,就无法完成使用串行队列的许多事情。)所以串行队列使用FIFO,而非串行队列(并发)使用随机执行标准?(例如,一点点代码块1,一点点代码块2…)参见我添加的图像。并发队列不会交替或交错块1和块2,而是同时独立执行这两个块。