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

2019-10-28 17:36:19 浏览数 (3)

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

代码语言:javascript复制
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 2;

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

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

代码语言:javascript复制
-(void)maxConcurrent{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
    
    for (int i=0; i<10; i  ) {
        float taskTime = arc4random()*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();
    });
}

得到的结果是这样的

image.png

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

代码语言:javascript复制
-(void)maxConcurrent{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
    
    for (int i=0; i<10; i  ) {
        float taskTime = arc4random()*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);
        }];
        
    }
    
}

image.png

0 人点赞