【发布时间】: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