Ios 全局队列的优先级意味着什么
我现在正在学习GCD。我创建了两个具有不同优先级的全局队列: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"
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]