当前位置: 首页 > 工具软件 > Dispatch > 使用案例 >

Dispatch

艾焱
2023-12-01

参考苹果文档点击此处可以查阅苹果对其详细解读。

Dispatch

通过将工作提交给系统管理的调度队列,在多核硬件上并发执行代码。


概述

Dispatch,也称为Grand Central Dispatch(GCD),包含语言功能、运行时库和系统增强功能,为支持macOS、iOS、watchOS和tvOS中的多核硬件上的并发代码执行提供了系统的、全面的改进。

BSD子系统、Core Foundation和Cocoa api都进行了扩展,以使用这些增强功能来帮助系统和应用程序更快、更高效地运行,并提高响应能力。考虑一下单个应用程序有效地使用多个核心有多困难,更不用说在具有不同计算核心数的不同计算机上或在多个应用程序竞争这些核心的环境中这样做了。在系统级运行的GCD可以更好地满足所有正在运行的应用程序的需求,以平衡的方式将它们与可用的系统资源相匹配。

 


Topics

Queues and Tasks

在应用程序的主线程或后台线程上连续或并发地管理任务执行的对象。

open class DispatchQueue : DispatchObject {
}

open class DispatchObject : OS_object {
}

open class OS_object : NSObject {
}

从以上可以看到DispatchQueue的定义是继承自NSObject,实现是在extention里面的

调度队列是FIFO队列,应用程序可以以块对象的形式向其提交任务。调度队列以串行或并发方式执行任务。提交给调度队列的工作在系统管理的线程池上执行。除了表示应用程序主线程的调度队列外,系统不保证使用哪个线程执行任务。

您可以同步或异步地安排工作项。当同步调度工作项时,代码将等待该项完成执行。当异步调度工作项时,代码将继续执行,而工作项将在其他位置运行。

尝试在主队列上同步执行工作项会导致死锁(Attempting to synchronously execute a work item on the main queue results in deadlock.

避免创建过多线程

在设计并发执行的任务时,不要调用阻止当前执行线程的方法。当并发调度队列调度的任务阻塞线程时,系统将创建其他线程来运行其他排队的并发任务。如果太多任务阻塞,系统可能会耗尽应用程序的线程。

应用程序消耗太多线程的另一种方式是创建太多私有并发调度队列。因为每个调度队列都消耗线程资源,所以创建额外的并发调度队列会加剧线程消耗问题。不要创建私有并发队列,而是将任务提交到一个全局并发调度队列。对于串行任务,请将串行队列的目标设置为全局并发队列之一。这样,您可以保持队列的序列化行为,同时最小化创建线程的独立队列的数量。

 

Creating a Dispatch Queue


  • Declaration

convenience init(label: String, qos: DispatchQoS = .unspecified, attributes: DispatchQueue.Attributes = [], autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit, target: DispatchQueue? = nil)

创建可以向其提交块的新调度队列。

  • Parameters

label:

附加到队列的字符串标签,用于在调试工具(如Instruments、sample、stackshots和崩溃报告)中唯一地标识队列。因为应用程序、库和框架都可以创建自己的调度队列,所以使用反向DNS命名样式(com.example.myqueue)建议使用。此参数是可选的,可以为空。

qos:

与队列关联的服务质量级别。此值确定系统安排任务执行的优先级。

attributes:

要与队列关联的属性。包括concurrent属性以创建并发执行任务的调度队列。如果省略该属性,则调度队列将连续执行任务。

autoreleaseFrequency:

自动释放由队列调度的块创建的对象的频率。 For a list of possible values, see DispatchQueue.AutoreleaseFrequency.

target:

要在其上执行块的目标队列。如果希望系统提供适合当前对象的队列,请指定DISPATCH\TARGET\QUEUE\DEFAULT。

 

 

 

 类似资料: