全局队列的优先级是什么意思

时间:2014-04-16 00:29:04

标签: ios objective-c grand-central-dispatch

我正在学习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];

    }
}

但结果显示两个队列是同时执行的,但并不是首先执行优先级较高的队列。那么优先权究竟意味着什么呢?

2 个答案:

答案 0 :(得分:2)

来自DISPATCH_QUEUE_PRIORITY_HIGH的文档:

  

调度到队列的项目以高优先级运行;队列计划在任何默认优先级或低优先级队列之前执行。

因此,来自不同队列的代码仍然可以并发运行,只是优先级较高的队列被安排在较低优先级队列之前执行。由于两个队列可以设置在不同的线程中,因此两个线程可以一起运行。但是,较高优先级队列(线程)很可能比较低优先级队列(线程)有更多机会完成。

计算运行task:需要多长时间(时钟时间)(尝试几次迭代)并查看优先级较高的队列是否比较低优先级队列更快完成可能会很有趣。

答案 1 :(得分:2)

当然,答案在dispatch_queue_priority_t Constants,但文字有点误导。

为什么你没有看到你期望的行为......

这是猜测(只是猜测)。你没有挤占CPU。在测试中,CPU有足够的时间来执行所有队列。否scheduler将仅基于优先级运行任务。这导致低优先级的任务永远不会执行。调度程序选择使用优先级作为标准之一的任务。

如果您使用100或1000个并发DISPATCH_QUEUE_PRIORITY_DEFAULT和DISPATCH_QUEUE_PRIORITY_LOW任务设置测试,您可能会开始看到调度程序如何支持更高优先级的任务。


<强>更新

无法相信我的错误......

答案在dispatch_queue_priority_t Constants,它总是会在优先级较低的队列中选择优先级较高的队列,就像文档所说的那样。

以下是我的示例代码版本:

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_LOW

之前未执行DISPATCH_QUEUE_PRIORITY_DEFAULT任务