我现在正在学习GCD。我创建了两个优先级不同的全局队列:
dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
我执行两个队列:
dispatch_async(q1, ^{
[self task:@"q1"];
});
dispatch_async(q2, ^{
[self task:@"q2"];
});
- (void)task:(NSString *)taskid
{
for (int i = 0; i < 1000; i++) {
NSLog(@"Now executing taskid:%@ num : %d", taskid, i);
[NSThread sleepForTimeInterval:5];
}
}
但结果表明,这两个队列是同时执行的,而不是优先级较高的队列首先执行。那么优先级到底意味着什么呢?
来自DISPATCH_QUEUE_PRIORITY_HIGH
:的文档
调度到队列的项目以高优先级运行;队列被调度为在任何默认优先级或低优先级队列之前执行。
因此,来自不同队列的代码仍然可以并发运行,只是优先级较高的队列被安排在优先级较低的队列之前执行。由于这两个队列可能设置在不同的线程中,因此这两个线程可以一起运行。但是,很可能优先级较高的队列(线程)将比优先级较低的队列(螺纹)有更多的机会完成。
对task:
运行所需的时间(时钟时间)进行计时(尝试几次迭代),并查看优先级较高的队列是否比优先级较低的队列完成得更快,这可能会很有趣。
当然,答案在dispatch_queue_priority_t常量中,但文本有点误导。
为什么你没有看到你期望的行为…
这只是猜测(而且只是猜测)。你没有挤满CPU。在测试中,CPU有足够的时间来执行所有队列。没有调度程序会仅根据优先级运行任务。这导致低优先级任务永远无法执行。调度程序选择仅使用优先级作为条件之一的任务。
如果使用100或1000个并发的DISPATCH_QUEUE_PRIORITY_DEFAULT和DISPATCH_REQUEUE_PRIORITY_LOW任务设置测试,您可能会开始了解调度程序如何支持更高优先级的任务
更新
真不敢相信我错得有多离谱…
答案在dispatch_queue_priority_t常量中,它总是会像文档中所说的那样,选择优先级较高的队列而不是优先级较低的队列。
这是我的示例代码版本:
dispatch_queue_t q1 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_queue_t q2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
for (int i = 0; i < 50; ++i) {
dispatch_async(q1, ^{
for (int j = 0; j < 5; ++j) {
NSLog(@"Now executing %@[%d:%d]", @"DISPATCH_QUEUE_PRIORITY_DEFAULT", i, j);
[NSThread sleepForTimeInterval:0.00001];
}
});
}
for (int i = 0; i < 50; ++i) {
dispatch_async(q2, ^{
for (int j = 0; j < 5; ++j) {
NSLog(@"Now executing %@[%d:%d]", @"DISPATCH_QUEUE_PRIORITY_LOW", i, j);
[NSThread sleepForTimeInterval:0.00001];
}
});
}
输出:
2014-04-15 21:27:22.525 APP_NAME[10651:1103] Now executing DISPATCH_QUEUE_PRIORITY_DEFAULT[0:0]
2014-04-15 21:27:22.526 APP_NAME[10651:1103] Now executing DISPATCH_QUEUE_PRIORITY_DEFAULT[0:1]
2014-04-15 21:27:22.526 APP_NAME[10651:3803] Now executing DISPATCH_QUEUE_PRIORITY_DEFAULT[1:0]
…
2014-04-15 21:27:22.810 APP_NAME[10651:3b03] Now executing DISPATCH_QUEUE_PRIORITY_DEFAULT[47:3]
2014-04-15 21:27:22.812 APP_NAME[10651:3b03] Now executing DISPATCH_QUEUE_PRIORITY_DEFAULT[47:4]
2014-04-15 21:27:22.812 APP_NAME[10651:3f03] Now executing DISPATCH_QUEUE_PRIORITY_DEFAULT[39:4]
2014-04-15 21:27:22.813 APP_NAME[10651:3d07] Now executing DISPATCH_QUEUE_PRIORITY_LOW[0:0]
2014-04-15 21:27:22.813 APP_NAME[10651:3f03] Now executing DISPATCH_QUEUE_PRIORITY_LOW[1:0]
2014-04-15 21:27:22.813 APP_NAME[10651:3d07] Now executing DISPATCH_QUEUE_PRIORITY_LOW[0:1]
…
2014-04-15 21:27:22.998 APP_NAME[10651:3d07] Now executing DISPATCH_QUEUE_PRIORITY_LOW[49:3]
2014-04-15 21:27:22.999 APP_NAME[10651:3f03] Now executing DISPATCH_QUEUE_PRIORITY_LOW[48:4]
2014-04-15 21:27:22.999 APP_NAME[10651:3d07] Now executing DISPATCH_QUEUE_PRIORITY_LOW[49:4]
在DISPATCH_QUEUE_PRIORITY_DEFAULT
之前未执行任何DISPATCH_QUEUE_PRIORITY_LOW
任务