2012-01-26 3 views
3

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

enter image description here

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

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

+0

У меня возникла проблема, связанная с выполнением операций с высоким приоритетом после операций с нормальным приоритетом. Не могу дождаться, чтобы получить ответы на эту тему! – raidfive

+0

Я думал о реализации своего собственного подкласса, чтобы позаботиться о зарезервированной емкости и т. Д. Однако выясняется, что для моей ситуации все, что мне было нужно, это меньший maxConcurrentOperationCount. Это позволяет выполнять задачи достаточно быстро (в отличие от 64 задач, каждая из которых выполняется несколько медленно), что в конечном итоге задержка была незначительной. – Tony

+0

Да, я заметил это раньше сегодня. Я понятия не имею, почему система решила запустить 64 параллельных задачи ... Я полагал, что это уменьшит это и придаст приоритет другим. – raidfive

ответ

1

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

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

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

Смежные вопросы