有没有办法限制GCD在我的应用程序中生成的线程数?

时间:2018-01-23 07:07:22

标签: ios multithreading grand-central-dispatch

我知道通过对this question的响应,产生的最大线程数不能超过66。但有没有办法将线程数限制为用户定义的值?

1 个答案:

答案 0 :(得分:0)

根据我在各种情况下的经验和与GCD的合作,我认为这是不可能的。

说,理解,通过使用GCD,生成队列,而不是线程 非常重要。每当从您的代码中调用创建队列时,GCD子系统就会检查操作系统状况并寻找可用资源。然后根据这些条件在引擎盖下创建新线程 - 按顺序并分配资源,而不是由您控制。这在官方文档中有明确解释:

  

在为应用程序添加并发性时,调度队列   提供比线程更多的优点。最直接的优势是   工作队列编程模型的简单性。有了线程,你   必须为你想要执行的工作和为你的工作编写代码   创建和管理线程本身。派遣队列让   你专注于你真正想要执行的工作而不必   担心线程的创建和管理。相反,系统   为您处理所有线程创建和管理。的的   优点是系统能够更多地管理线程   比任何单一的应用程序都有效。系统可以   根据可用的动态扩展线程数   资源和当前系统条件。此外,系统是   通常能够比你更快地开始运行你的任务   你自己创建了这个帖子。

     

来源:Dispatch Queues

您无法通过设置某种阈值来控制GCD的资源消耗。 GCD是对低级事物(如线程)的高级抽象,它为您管理它。

你可以影响应用程序中特定任务应该占用多少资源的唯一方法是设置其QoS (Quality of Service)类(以前简称为优先级,扩展为更复杂的类)概念)。简而言之,您可以根据应用程序的重要性对应用程序中的任务进行分类,这样可以帮助GCD和您的应用程序提高资源和电池效率。在具有大量并发使用的复杂应用程序中,它受到高度鼓励。 然而,即便如此,开发人员端的这种规则也有其局限性,并最终没有解决控制线程创建的目标:

  

应用和运营竞争使用有限的资源 - CPU,内存,   网络接口等。为了保持响应和   高效,系统需要优先处理任务并使智能化   关于何时执行它们的决定。

     

直接影响用户的工作(例如UI更新)非常有用   重要且优先于可能发生的其他工作   在后台。这项更高优先级的工作通常会消耗更多能   因为它可能需要大量且立即访问系统   资源。

     

作为开发人员,您可以通过更有效地帮助系统确定优先级   根据重要性对应用的工作进行分类。即使你已经   实施其他效率措施,例如将工作推迟到   最佳时间,系统仍需要执行某种程度的   优先级。因此,对其进行分类仍然很重要   让你的应用程序运行。

     

来源:Prioritize Work with Quality of Service Classes

总而言之,如果您故意控制线程,请不要使用GCD。使用低级编程技术并自行管理。如果你使用GCD,那么你同意将这种责任留给GCD。