【问题标题】:NSOperationQueue with reserve capacity?具有预留容量的 NSOperationQueue?
【发布时间】:2012-01-26 07:12:49
【问题描述】:

通常NSOperationQueue 保证低优先级的任务在高优先级的任务执行完成之前不会被执行。但是,当大量操作快速添加到队列中时,有时操作队列会过载,如下所示

此图表跟踪 1000 次操作的历史记录。红线表示当前正在执行的具有NSOperationQueueVeryLowPriority 优先级的任务数,绿线显示队列中空闲且NOT正在执行的具有NSOperationQueueNormalPriority 的任务数,最后是蓝线显示队列中的操作总数。

现在,在这种情况下,NSOperationQueue 的默认最大并发数似乎是 64。当所有这 64 个插槽都被填满时,即使存在具有更高优先级的任务,它们也不会被执行并且必须等待.我的问题是,有什么方法可以调整NSOperationQueue,这样即使在负载下,它也能为更高优先级的操作保留一些容量?

【问题讨论】:

  • 我遇到了一个相关问题,即我的高优先级操作在正常优先级操作之后执行。迫不及待地想在这个线程上得到一些答案!
  • 我正在考虑实现我自己的子类来处理保留容量等问题。然而,事实证明,对于我的情况,我只需要一个较小的 maxConcurrentOperationCount。这使得任务能够以足够快的速度完成(与 64 个任务相反,每个任务执行得有点慢),最终延迟可以忽略不计。
  • 是的,我今天早些时候注意到了这一点。我不知道为什么系统会决定运行 64 个并发任务......我认为它会限制它并优先考虑其他任务。
  • 是的,那些具有后台优先级的操作让我的系统因这 64 个并发任务而疯狂旋转。 (我想这就是让系统管理最大并发数的全部意义 - 以最大化系统资源......)但是将其限制为 16 甚至 8 大大改善了每个任务所需的时间(我只有 2 个内核,而不是 64 ...)

标签: objective-c cocoa concurrency nsoperationqueue


【解决方案1】:

NSOperationNSOperationQueue 我也有类似的问题。

我有一个继承自NSOperation 的类(带有NSURLConnection)。我有NSOperationQueue 设置。我正在向该队列添加大约 5000-6000 次操作。这里的问题是并非所有操作都被执行。它正好停在 64 处。发现对于 intel-i5 处理器,并发操作期间的默认最大线程数似乎是 64。

解决方案是使用NSRunLoop: 声明了一个获取 currentLoop 的 NSRunLoop。并运行循环几秒钟。 这样做会每隔几秒退出一次 currentLoop。这样,在任何时间点,最大线程数都小于 64。我的应用程序正常工作。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2010-12-03
    相关资源
    最近更新 更多