NSOperationQueue с резервной мощностью? - PullRequest
3 голосов
/ 26 января 2012

Обычно NSOperationQueue гарантирует, что задачи с низкими приоритетами не будут выполняться, пока не будут выполнены задачи с высокими приоритетами. Однако, когда большое количество операций быстро добавляется в очередь, иногда очередь операций может перегружаться, как показано ниже

enter image description here

Этот график отслеживает историю 1000 операций. Красная линия показывает количество задач с приоритетом NSOperationQueueVeryLowPriority, которые в данный момент выполняются, зеленая линия показывает количество задач с NSOperationQueueNormalPriority, которые бездействуют в очереди и NOT , которые выполняются, и, наконец, синий строка показывает общее количество операций в очереди.

Теперь максимальный параллелизм NSOperationQueue по умолчанию в этом случае составляет 64. Когда все эти 64 слота заполнены, даже если задачи с более высоким приоритетом существуют, они не выполняются и должны ждать , У меня вопрос, есть ли способ настроить NSOperationQueue так, чтобы даже под нагрузкой он оставлял часть мощности для операций с более высоким приоритетом?

1 Ответ

1 голос
/ 02 сентября 2012

У меня похожая проблема с NSOperation & NSOperationQueue.

У меня есть класс (с NSURLConnection), который наследуется от NSOperation. У меня есть настройка NSOperationQueue. Я добавляю около 5000-6000 операций в эту очередь. Проблема здесь в том, что не все операции выполняются. Он останавливается точно на 64. Обнаружено, что максимальное число потоков по умолчанию при одновременных операциях кажется 64 для процессора intel-i5.

Решение использует NSRunLoop: Объявлен NSRunLoop, который получает currentLoop. И запустить цикл в течение нескольких секунд. Выполнение этого будет выходить из currentLoop каждые несколько секунд. Таким образом, в любой момент максимальное число нитей будет меньше 64. Мое приложение просто работает. :)

...