iOS-GCD信号量实现最大并发

1.实现最大并发数,在iOS里,最容易使用的是NSOperationQueue,如下

NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 2;

NSOperationQueue中,已经考虑到了最大并发数的问题,并提供了maxConcurrentOperationCount属性设置最大并发数(该属性需要在任务添加到队列中之前进行设置)。maxConcurrentOperationCount默认值是-1;如果值设为0,那么不会执行任何任务;如果值设为1,那么该队列是串行的;如果大于1,那么是并行的。

2.用GCD信号量实现(默认你对信号量已有一定了解),如下:

-(void)maxConcurrent{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
    
    for (int i=0; i<10; i++) {
        float taskTime = arc4random()%10*0.1*3;
        NSLog(@"开始第%d条任务",i);
        [self netWork_task_requestTime:taskTime completionHandle:^{
            NSLog(@"已完成第%d条任务",i);
            dispatch_semaphore_signal(semaphore);
        }];
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    }
    
}

- (void)netWork_task_requestTime:(float)time completionHandle:(void(^)(void))success {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(time * NSEC_PER_SEC)), dispatch_get_global_queue(0, 0), ^{
        success();
    });
}

得到的结果是这样的
iOS-GCD信号量实现最大并发_第1张图片
image.png

解释:
我们可以看到,第1-4一共4条任务得以执行,然后只有完成一条或多条任务后,另一条或多条才能得以执行,控制了任务执行的最大数量是4条。
我们信号量给的是3,从结果来看最大并发数是4,这只是跟
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);这个方法在任务前还是后执行有关,如下:

-(void)maxConcurrent{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
    
    for (int i=0; i<10; i++) {
        float taskTime = arc4random()%10*0.1*3;
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        NSLog(@"开始第%d条任务",i+1);
        [self netWork_task_requestTime:taskTime completionHandle:^{
            NSLog(@"已完成第%d条任务",i+1);
            dispatch_semaphore_signal(semaphore);
        }];
        
    }
    
}
iOS-GCD信号量实现最大并发_第2张图片
image.png

你可能感兴趣的:(iOS-GCD信号量实现最大并发)