全局队列的优先级意味着什么



我现在正在学习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任务

最新更新