美文网首页
GCD & concurrency

GCD & concurrency

作者: tom__zhu | 来源:发表于2020-03-02 13:31 被阅读0次

Grand Central Dispatch (GCD) 是苹果提供的一套队列基础库。通过GCD可以使应用程序的体验更加丝滑顺畅。


并发(concurrency)

有必要在介绍GCD前先了解什么是并发。通常,任务以顺序并发方式执行。任务(想象为一串代码)们按顺序一个接一个的被执行,后执行的任务总是等待前一个任务执行结束才开始,那么这一连串的任务被称为按顺序执行。相应的,如果若干任务同时被执行,那么这一连串的任务被称为按并发执行。类比想象一下银行的柜员与一队等待的顾客,如果将顾客的排队比作顺序执行,那么顾客将不得在一个缓慢行进的队伍中等待。假如队列是并发的,那么情况将变为一个柜员同时接待若干个排队顾客。
上面的例子其实又引申出另一个话题:并行(parallel)。银行的例子是一个非并行的例子。如果我们想要一个并发且并行的样子,那么我们需要再增加几个银行柜员以同时独立的应对若干排队顾客。
那么并发且非并行的样子可以想象为在餐厅点餐。餐厅前台服务员负责接收订单然后转交给唯一的一位厨师,并接着为下位顾客服务。一旦厨师完成订单,服务员会将食物递交给顾客,整个程序循环往复。如果这件事是串行的,那么后面的顾客只能等待厨师将上一个菜单准备齐全并且服务员递交给顾客。但并发且并行的样子则是有若干厨师与若干服务员同时工作。

并行性(Parallel)需要并发性(currency),但并发(currency)并不意味着并行性(Parallel)。

之前有次被问道单核中并行的意义是什么。现在如果换做是你,你会怎么回答?

用图表形式表示的话,方块表示顾客,圆圈表示厨师。



synchronous & asynchronous

提及并发则不得不说同步(synchronous)&异步(asynchronous)。他们的的差异首先从直观上来说就是,同步的方法运行时,方法栈递归返回上一个方法指针的时机是方法体执行结束。异步的方法运行时,方法则直接返回而不用等待方法执行结束。
这种区别是非常重要的,因为同步方法使用不当会导致主线程发生阻塞,进而进程无法响应系统抛出EXC_BAD_INSTRUCTION。所以同步方法需要尽可能保持快速响应快速执行。对于那些时间开销较大的方法来说,异步方法在队列中执行应该被选用。这种方法并不会阻塞主线程,进程会安静的等待异步执行的结果。


Dispatch Queues

一个队列可以看作为一个汽车隧道,先进入的汽车先出,后进入的汽车后厨。dispatch queue之所以被这么称呼是因为我们在向队列分发(dispatch)任务。
串行队列(serial queue)的任务被串行执行。从之前的描述中我们知道,串行的意思是下一个任务等待上一个任务完成后才会进行。那么任务分发(dispatch)到队列的顺序决定了他的执行以及完成顺序。
并发队列(concurrent queue)的任务别并发执行。一个任务被分发到并发队列中并立即返回,下一个任务同时被添加到队列中。队列中的任务被并发执行,每个任务执行结束的时间没有先后顺序,由任务执行时间长短所决定。
用图表形式表示的话如下图。串行队列中,任务由入队顺序依次执行。并发队列中,任务执行的时间并没有严格顺序,结束时间也随任务耗时而变化。


Quality of Service (QoS)

last but not least one more thing.
每一个并发队列都有他的**Quality of Service (QoS) **,我们需要根据任务的执行情况选取合适的QoS。
下表示苹果文档中截取的QoS类型以及说明。


https://developer.apple.com/documentation/dispatch/dispatchqos/qosclass

参考

相关文章

  • GCD & concurrency

    Grand Central Dispatch (GCD) 是苹果提供的一套队列基础库。通过GCD可以使应用程序的体...

  • wwdc2017/706-GCD 的现代化应用

    总结自: 字节跳动-GCD 的现代化应用 收获一 并行(Parallelism)和并发(concurrency)概...

  • Swift进阶 - Concurrency之GCD

    如果看完了之前写的Swift初学中的文章,应该对swift的基础有了一定的掌握。现在我们讨论一下进阶一些的知识,当...

  • GCD篇(1)

    GCD的队列有两种,一种是串行队列,一种是并发队列。 并行与并发的区别 并发(concurrency) 并行(pa...

  • Java Concurrent Programming - 1

    Concurrency Java Tutorials - Concurrency Processes and Th...

  • 并发编程指南:概要

    原文:Concurrency Programming Guide 翻译: skycolor Concurrency...

  • Java Concurrent Programming - 2

    Concurrency-2 Java Tutorials - Concurrency High Level Con...

  • Java并发编程与高并发解决方案

    项目地址 :https://github.com/Zihaoo/concurrency concurrency :...

  • Concurrency

    critical section Our goroutine, which is incrementing the...

  • Concurrency

    为了提升程序性能,我们可以将任务分成互相独立的子任务并使用多线程来处理。这里提供了详细的讲解,本文是作者的读书笔记...

网友评论

      本文标题:GCD & concurrency

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