[英]priority of Dispatch Queues in swift 3
我在Swift 3中阅读了有关GCD和Dispatch Queue的教程
但我对同步执行和异步执行以及主队列和后台队列的顺序感到困惑。
我知道如果我们使用同步,那么我们在珍贵的一个之后执行它们,如果我们使用异步,那么我们可以使用QoS来设置它们的优先级,但是这种情况怎么样?
func queuesWithQoS() {
let queue1 = DispatchQueue(label: "com.appcoda.myqueue1")
let queue2 = DispatchQueue(label: "com.appcoda.myqueue2")
for i in 1000..<1005 {
print(i)
}
queue1.async {
for i in 0..<5{
print(i)
}
}
queue2.sync {
for i in 100..<105{
print( i)
}
}
}
结果表明我们忽略了异步执行。 我知道queue2应该在queue1之前完成,因为它是同步执行但是为什么我们忽略了异步执行,async,sync和所谓的主队列之间的实际区别是什么?
你说:
结果表明我们忽略了异步执行。 ...
不,这只是意味着您没有给异步调度代码足够的时间来开始。
我知道queue2应该在queue1之前完成,因为它是同步执行的...
首先,queue2可能无法在queue1之前完成。 它恰好发生了。 使queue2做得慢得多(例如循环几千次而不是五次),你会发现queue1实际上可以同时运行在queue2上的内容。 它只需要几毫秒的时间就可以完成,而非常简单的queue2上的东西在queue1上的东西有机会启动之前就完成了。
其次,这种行为在技术上并不是因为它是同步执行。 只是异步需要几毫秒才能让它在某个工作线程上运行,而同步调用因为我不会厌烦你的优化,会更快地启动。
但为什么我们忽略异步执行......
我们不“忽视”它。 开始只需几毫秒。
什么是异步,同步和所谓的主队列之间的实际区别?
“异步”仅仅意味着当前线程可以继续而不是等待调度代码在某个其他线程上运行。 “同步”表示当前线程应该等待分派的代码完成。
“主线程”是一个不同的主题,只是指为驱动UI而创建的主线程。 在实践中,主线程是大多数代码运行的地方,基本上运行除手动调度到某个后台队列(或者为您调度的代码,例如URLSession
完成处理程序)之外的所有内容。
首先,我更喜欢使用术语“延迟”而不是“忽略”代码执行,因为您的问题中的所有代码都已执行。
QoS是一个枚举 ,第一个类表示最高优先级,最后一个表示最低优先级,当您没有指定任何优先级时,您有一个具有默认优先级的队列,默认位于中间:
说,你有两个同步的for-in循环和一个async,其中优先级是基于循环的位置和代码中的队列类型(sync / async),因为这里我们有3个不同的队列 (跟随关于你的链接 queuesWithQoS()
可以在viewDidAppear
启动,所以我们可以假设在主队列中)
代码显示了两个具有默认优先级的队列的创建,因此执行的顺序将是:
在执行所有UI指令的情况下,主队列始终具有最高优先级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.