2012-01-26 13 views
3

通常、NSOperationQueueは、プライオリティの低いタスクが実行されるまで、プライオリティの低いタスクは実行されません。このグラフ1000回の操作の履歴を追跡予備容量のあるNSOperationQueue?

enter image description here

下に示されているようしかし、操作多数のキューに迅速に添加した場合、時々操作キューは、オーバーロードすることができます。赤い線は、現在実行中のNSOperationQueueVeryLowPriority優先度のタスクの数を示し、緑色の線は、待ち行列でアイドルであるNSOperationQueueNormalPriorityのタスクの数を示し、であり、最後に青い線は、待ち行列。

この場合、NSOperationQueueのデフォルトの最大同時実行性は64と思われます。これらの64個のスロットがいっぱいになると、優先度の高いタスクが存在しても実行されずに待機する必要があります。私の質問は、NSOperationQueueを微調整する何らかの方法があるため、負荷がかかっても優先度の高い操作のためにいくつかの容量を予約していますか?

+0

私の優先度の高い操作が通常の優先度の操作の後に実行されている関連問題があります。このスレッドでいくつかの答えを得るのを待つことができません! – raidfive

+0

私は、自分のサブクラスを実装して予約された容量などを処理することを考えていました。しかし、私の状況では、必要なものはすべて、より小さいmaxConcurrentOperationCountでした。これにより、タスクは遅れが無視できる程度に遅くても十分に速く完了することができます(それぞれ64タスクにいくぶんゆっくりと実行されます)。 – Tony

+0

はい、私は今日これを気づいた。私はシステムが64の並行タスクを実行することを決める理由がわからない...私はそれがそれを抑制し、他の人に優先権を与えると考えた。 – raidfive

答えて

1

私はNSOperation & NSOperationQueueと同様の問題があります。

NSOperationを継承するクラス(NSURLConnection)があります。私はNSOperationQueueの設定を持っています。私はその待ち行列に約5000-6000のオペレーションを追加しています。ここで問題となるのは、すべての操作が実行されるわけではないということです。これは64で正確に停止します。同時操作中のデフォルトの最大スレッド数がintel-i5プロセッサーでは64に見えることが判明しました。

解決策を使用していますNSRunLoop: は、currentLoopを取得するNSRunLoopと宣言しました。ループを数秒間実行します。 これを実行すると、数秒ごとにcurrentLoopが終了します。この方法で、任意の時点で、最大スレッド数は64未満です。私のアプリはちょうど動作します。 :)

関連する問題