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

Ios 全局队列的优先级意味着什么,ios,objective-c,grand-central-dispatch,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"

我现在正在学习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\u async(q1^{
[自我任务:@“q1”];
});
调度异步(第2季度^{
[自我任务:@“q2”];
});
-(void)任务:(NSString*)任务ID
{
对于(int i=0;i<1000;i++){
NSLog(@“正在执行任务ID:%@num:%d”,任务ID,i);
[NSThread sleepForTimeInterval:5];
}
}

但结果表明,这两个队列是并行执行的,而不是优先级较高的队列首先执行。那么优先权到底意味着什么呢

来自
调度队列优先级高的文档

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

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


计算运行(尝试多次迭代)所需的时间(时钟时间),并查看高优先级队列是否比低优先级队列快。

来自
调度队列优先级高的文档:

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

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

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

当然,答案是肯定的,但文本有点误导

为什么你看不到你期望的行为

这只是猜测(而且只是猜测)。你没有挤满CPU。在测试中,CPU有足够的时间执行所有队列。否将仅基于优先级运行任务。这会导致低优先级任务无法执行。调度器选择一个仅使用优先级作为标准之一的任务

如果将测试设置为100或1000个并发调度\u队列\u优先级\u默认任务和调度\u队列\u优先级\u低任务,您可能会开始看到调度程序如何支持高优先级任务


更新

真不敢相信我错了

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

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

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];

        }
    });
}
没有
DISPATCH\u QUEUE\u PRIORITY\u LOW
任务是在
DISPATCH\u QUEUE\u PRIORITY\u DEFAULT
之前执行的。当然,答案在中,但文本有点误导

为什么你看不到你期望的行为

这只是猜测(而且只是猜测)。你没有挤满CPU。在测试中,CPU有足够的时间执行所有队列。否将仅基于优先级运行任务。这会导致低优先级任务无法执行。调度器选择一个仅使用优先级作为标准之一的任务

如果将测试设置为100或1000个并发调度\u队列\u优先级\u默认任务和调度\u队列\u优先级\u低任务,您可能会开始看到调度程序如何支持高优先级任务


更新

真不敢相信我错了

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

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

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];

        }
    });
}

没有
DISPATCH\u QUEUE\u PRIORITY\u LOW
任务在
DISPATCH\u QUEUE\u PRIORITY\u DEFAULT

根据我的经验,队列优先级平均会影响任务的运行顺序,但不会始终影响每个任务所用的时间。根据我的经验,队列优先级平均会影响,任务的运行顺序,但不会始终影响每个任务所需的时间。2014-04-16 18:47:42.195 ITGCDLearning[66147:3b03]正在执行调度队列优先级默认[6:0]2014-04-16 18:47:42.200 ITGCDLearning[66147:4b03]正在执行调度队列优先级默认[14:0]2014-04-16 18:47:42.199 ITGCDLearning[66147:4403]正在执行调度队列优先级低[7:0]2014-04-16 18:47:42.201 ITGCDLearning[66147:5203]正在执行调度队列优先级低[14:0]2014-04-16 18:47:42.205 ITGCDLearning[66147:6703]正在执行调度队列优先级默认[28:0]2014-04-16 18:47:42.195 ITGCDLearning[66147:3b03]正在执行调度队列优先级默认值[6:0]2014-04-16 18:47:42.200 ITGCDLearning[66147:4b03]正在执行调度队列优先级默认值[14:0]2014-04-16 18:47:42.199 ITGCDLearning[66147:4403]正在执行调度队列优先级低[7:0]2014-04-16 18:47:42.201 ITGCDLearning[66147:5203]正在执行调度队列优先级低[14:0]2014-04-16 18:47:42.205 ITGCDLearning[66147:6703]正在执行调度队列优先级默认值[28:0]