Swift 如果在串行DispatchQueue中触发上下文切换,会发生什么情况?

Swift 如果在串行DispatchQueue中触发上下文切换,会发生什么情况?,swift,multithreading,grand-central-dispatch,swift-playground,Swift,Multithreading,Grand Central Dispatch,Swift Playground,原则上,串行DispatchQueue将逐个执行提交的任务。但是,如果在一个任务中触发了上下文切换(例如,调用sleep),该怎么办?队列是立即执行下一个任务,还是等待当前任务完成 对于此代码: q.async { print("IN 1") var i = 1 while i < 10 { Thread.sleep(forTimeInterval: 0.1) i += 1 } print("OUT of 1") } q.asy

原则上,串行
DispatchQueue
将逐个执行提交的任务。但是,如果在一个任务中触发了上下文切换(例如,调用
sleep
),该怎么办?队列是立即执行下一个任务,还是等待当前任务完成

对于此代码:

q.async {
    print("IN 1")
    var i = 1
    while i < 10 {
     Thread.sleep(forTimeInterval: 0.1)
     i += 1
    }
    print("OUT of 1")
}

q.async {
    print("IN 2")
}
我试着在操场上运行代码,但似乎
sleep
(和
Thread.sleep
)在操场上不起作用

原则上,串行DispatchQueue将逐个执行提交的任务。但是,如果在一个任务中触发了上下文切换(比如,调用睡眠),该怎么办?队列是立即执行下一个任务,还是等待当前任务完成

串行队列不是“串行”的,因为它的任务是串行提交的(事实上,大多数任务通常是串行提交的,即使在并行队列上也是如此),而是因为任务保证按照提交顺序逐个完成

Thread.sleep
在操场上可以正常工作,但您的操场会提前终止它的执行。当控制流到达页面末尾时,游乐场的执行终止。因此,像这样的异步任务只有在控制流到达页面末尾之前执行时才会完成,这是不太可能的

要使游乐场无限期运行(直到手动终止),请使用:

原则上,串行DispatchQueue将逐个执行提交的任务。但是,如果在一个任务中触发了上下文切换(比如,调用睡眠),该怎么办?队列是立即执行下一个任务,还是等待当前任务完成

串行队列不是“串行”的,因为它的任务是串行提交的(事实上,大多数任务通常是串行提交的,即使在并行队列上也是如此),而是因为任务保证按照提交顺序逐个完成

Thread.sleep
在操场上可以正常工作,但您的操场会提前终止它的执行。当控制流到达页面末尾时,游乐场的执行终止。因此,像这样的异步任务只有在控制流到达页面末尾之前执行时才会完成,这是不太可能的

要使游乐场无限期运行(直到手动终止),请使用:


在前一个块完成之前,串行队列不会开始执行下一个块。上下文切换不会影响这一点。如果在提交到串行队列的块中调用
sleep
,则将阻塞队列,直到睡眠完成并且块可以继续执行为止。因此,您的结果将是
IN 1->OUT of 1->IN 2


请注意,一般情况下,您不希望在提交到队列的块中执行阻塞操作(如
sleep
),因为这将阻塞整个线程,使libdispatch无法用于其他工作。libdispatch将根据需要启动新线程以继续工作,但它将生成的新线程数量是有限制的。

串行队列在前一个块完成之前不会开始执行下一个块。上下文切换不会影响这一点。如果在提交到串行队列的块中调用
sleep
,则将阻塞队列,直到睡眠完成并且块可以继续执行为止。因此,您的结果将是
IN 1->OUT of 1->IN 2


请注意,一般情况下,您不希望在提交到队列的块中执行阻塞操作(如
sleep
),因为这将阻塞整个线程,使libdispatch无法用于其他工作。libdispatch将根据需要启动新线程以继续工作,但它将生成的新线程数量是有限的。

的确如此。感谢您提供有关PlaygroundSupport的提示!的确感谢您提供有关PlaygroundSupport的提示!
// IN 1 -> OUT of 1 -> IN 2 ?
// or IN 1 -> IN 2 -> OUT of 1 ?
import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true