阿里开源 iOS 协程开发框架 coobjc 简易学习

如果现在感到压力很大,可能现在的目标与当前你的总体状态(身体状态,心理状态,外围环境,目标强度)不好,需要切换一个切实可行的目标。压力不要太大。

https://mp.weixin.qq.com/s/hXmkd0TqTrCD-4kYlZcqvQ

1、协程也是一种程序组件,协程与子例程一样。

2、一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

3、协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器,无限列表和管道。 协程最初在1963年被提出。

4、针对多线程以及尤其引发的各种崩溃和性能问题,我们制定了很多编程规范、进行了各种新人培训,尝试降低问题发生的概率,但是问题依然很严峻,多线程引发的问题占比并没有明显的下降,异步编程本来就是很复杂的事情,单靠规范和培训是难以从根本上解决问题的,需要有更加好的编程方式来解决。

5、上述问题在很多系统和语言开发中都可能会碰到,解决问题的标准方式就是使用协程,C#、Kotlin、Python、Javascript 等热门语言均支持协程极其相关语法,使用这些语言的开发者可以很方便的使用协程及相关功能进行异步编程。

6、2017 年的 C++ 标准开始支持协程,Swift5 中也包含了协程相关的标准,从现在的发展趋势看基于协程的全新的异步编程方式,是我们解决现有异步编程问题的有效的方式,但是苹果基本已经不会升级 Objective-C 了,因此使用Objective-C的开发者是无法使用官方的协程能力的,而最新 Swift 的发布和推广也还需要时日,为了让广大iOS开发者能快速享受到协程带来的编程方式上的改变,手机淘宝架构团队基于长期对系统底层库和汇编的研究,通过汇编和C语言实现了支持 Objective-C 和 Swift 协程的完美解决方案 —— coobjc。

//主线程创建协程

7、co_launch(^{

    //异步加载网络数据

    NSData *data = await([NSURLConnection async_sendAsynchronousRequest:request response:nil error:nil]);

  //异步解析图片

   UIImage *image = await([UIImage async_imageWithData:data]);

   //显示图片

  imageView.image = image;

});

8、旧的处理方式

[NSURLSession sharedSession].configuration.requestCachePolicy = NSURLRequestReloadgnoringCacheData;

  NSURLSessionDownloadTask *task = [[NSURLSession sharedSession] downloadTaskWithURL:url completionHandler:

                                             ^(NSURL *locotion, NSURLResponse, NSError *error){

                                            if (error){

                                    return;

                                               }

//在子线程解析数据,并生成图片

  dispatch_async(dispatch_get_globbal_queue(0,0),^{

  NSData *data = [[NSData alloc] initWithContentsOfURL:location];

  UIImage *image = [UIImage alloc] initWithData:data];

dispacth_async(dispatch_get_main_queue(),^{

//调度到主线程显示图片

imageView.image = image;

  });

)

9、原本需要20行的代码,通过coobjc协程化改造后,减少了一半,整个代码逻辑和可读性都更加好,这就是coobjc强大的能力,能把原本很复杂的异步代码,通过协程化改造,转变成逻辑简洁的顺序调用。

10、从上面的表格我们可以看到使用在并发量很小的场景,由于多线程可以完全使用设备的计算核心,因此coobjc总耗时要比传统多线程略高,但是由于整体耗时都很小,因此差异并不明显,但是随着并发量的增大,coobjc的优势开始逐渐体现出来,当并发量超过1000以后,传统多线程开始出现线程分配异常,而导致很多并发任务并没有执行,因此在上表中显示的是大于20秒,实际是任务已经无法正常执行了,但是coobjc仍然可以正常运行。

我们在手机淘宝这种超级App中尝试了协程化改造,针对部分性能差的页面,我们发现在滑动过程中存在很多主线程IO调用、数据解析,导致帧率下降严重,通过引入coobjc,在不改变原有业务代码的基础上,通过全局hook部分IO、数据解析方法,即可让原来在主线程中同步执行的IO方法异步执行,并且不影响原有的业务逻辑,通过测试验证,这样的改造在低端机(iPhone6及以下的机器)上的帧率有20%左右的提升。

11、调度性能更快:协程本身不需要进行内核级线程的切换,调度性能快,即使创建上万个协程也毫无压力。

猜你喜欢

转载自blog.csdn.net/u014544346/article/details/88029620