美文网首页iOS进阶
iOS多任务并发设计

iOS多任务并发设计

作者: 起个名字想破头 | 来源:发表于2017-08-29 15:36 被阅读74次

问题假如现在有1w个任务需要执行,并且在全部执行完成之后进行一个提示,该怎么做?

思路1:最直接的会想到dispatch_group,本身就是为一组任务设计的

#define OPERATION_COUNT         10000
#define OPERATION_SLEEP_TIME    0.01f

- (void)myOperation:(NSInteger)index {
    [NSThread sleepForTimeInterval:OPERATION_SLEEP_TIME];    
}

- (void)runMyOperationsWithGCD {
    dispatch_group_t group = dispatch_group_create();
    for (int i = 0; i < OPERATION_COUNT; i++) {
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            [self myOperation:i];
        });
    }
    
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"operations are finished");
    });
}

思考1:这段代码看的应该非常清爽,但是会创建过多的线程,也给系统带来了巨大的负担,是需要优化的。


问题假设在原始问题的基础上约束最多10个并发线程,又有什么好的办法?

思路2:采用iOS的NSOperationQueue,这个东西简直是按照这种需求设计的,非常好用

#define MAX_CONCURRENT_COUNT 10
#define OPERATION_COUNT     10000
#define OPERATION_SLEEP_TIME    0.1f

- (void)myOperation:(NSInteger)index {
    NSLog(@"enter myOperation:%ld, thread:%@", (long)index, [NSThread currentThread]);
    [NSThread sleepForTimeInterval:OPERATION_SLEEP_TIME];    
}

- (void)runMyOPerationsWithNSOperation {
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    queue.maxConcurrentOperationCount = MAX_CONCURRENT_COUNT;//设置最大并发数
    for (int i = 0; i < OPERATION_COUNT; i++) {
        [queue addOperationWithBlock:^{
            [self myOperation:i];
        }];
    }
        
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [queue waitUntilAllOperationsAreFinished];//等待所有任务完成
        NSLog(@"operations are finished");
    });
}

思考2:个人觉得,这是最方便的方法,简单明了,没有过多的线程和冗余的代码。


问题如果不使用NSOperation,又有什么好的办法吗?

思路3:通过信号量控制并发,并结合思路1的dispatch_group实现组任务完成后的通知

#define MAX_CONCURRENT_COUNT 10
#define OPERATION_COUNT     10000
#define OPERATION_SLEEP_TIME    0.1f

- (void)myOperation:(NSInteger)index {
    NSLog(@"enter myOperation:%ld, thread:%@", (long)index, [NSThread currentThread]);
    [NSThread sleepForTimeInterval:OPERATION_SLEEP_TIME];
}

- (void)runMyOperationsWithSemaphore {
    //创建信号量,控制最大并发数为10
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(MAX_CONCURRENT_COUNT);
    dispatch_group_t group = dispatch_group_create();
    for (int i = 0; i < OPERATION_COUNT; i++) {
        //wait一次,semaphore减一,当semaphore小于0时会一直wait
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            [self myOperation:i];
            //任务完成后,触发semaphore,以允许新的任务进入
            dispatch_semaphore_signal(semaphore);
        });
    }

    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        NSLog(@"operations are finished");
    });
}

思考3:这种方式其实是在思路1的基础上增加了信号量的并发限制,相当于一种简单的改进。

最后,如果采用最传统的NSThread,跟信号量配合,可以实现多任务并发,但如何判断所有任务都已执行完毕,只想到了通过计数的方式,并没有想到更好的办法。如果大家有更好的办法,欢迎留言,私信!

最最后,附上demo,地址

相关文章

  • iOS多任务并发设计

    问题:假如现在有1w个任务需要执行,并且在全部执行完成之后进行一个提示,该怎么做? 思路1:最直接的会想到disp...

  • Swift (GCD)异步并发+网络 任务执行结束统一处理 解决

    上代码: 测试结果 灵感来源:iOS】异步并发多任务 任务执行结束统一处理 (控制并发量)移除了信号量相关的代码,...

  • #iOS多任务并发执行解决方案

    iOS多任务并发执行解决方案 Operation object: 该技术出现在OS X 10.5中,通过将要执行的...

  • 进程、线程

    时间片轮转 并行:真的多任务 并发:假的多任务

  • Human Interface Guidelines——Mult

    尝试阅读《Human Interface Guidelines》原文翻译学习iOS设计指南。 多任务可以让你在任何...

  • 【2020-02-24】leetcode 多线程

    多线程---并发 并发主要为多任务情况设计:竞态条件:由于多进程之间的竞争执行,导致程序未按照期望的顺序输出。死锁...

  • 多任务

    并行:真的多任务并发:假的多任务 普通解释:并发:交替做不同事情的能力并行:同时做不同事情的能力专业术语:并发:不...

  • Python多任务总结

    多任务什么是多任务同时做多件事件(做个多个任务),运行多个方法多任务的原理并发:假的多任务,时间片的轮转,快速的交...

  • 12-Python之路-进阶-多任务

    多任务:线程 多任务:简介 操作系统可以同时运行多个任务。操作系统轮流让各个任务交替执行,实现的多任务效果 并发:...

  • C++多线程

    基于进程的多任务处理是程序的并发执行。 基于线程的多任务处理是同一程序的片段的并发执行。 c++多线程编程使用的是...

网友评论

    本文标题:iOS多任务并发设计

    本文链接:https://www.haomeiwen.com/subject/iupodxtx.html