2016-09-07 187 views
0

我有一個應用程序,在使用各種統計員(如目錄統計員)睡眠長時間運行的過程

我看到OS X說我的過程「中招燒CPU」,因爲其採取記錄數以萬計的迭代這樣做的CPU數量很大。

我想這樣做的是建立在一個「壓力閥」,如

[NSThread sleepForTimeInterval:cpuDelay]; 

不阻止的事情就像一個雙核機的其他進程/線程。

我的處理是發生在一個單獨的線程,但我不能擺脫,然後重新輸入枚舉循環,並使用NSTimers,讓機器「呼吸」

任何建議 - 應該[NSThread sleepForTimeInterval:cpuDelay];是工作?

我分派隊列中運行這些東西:

if(!primaryTask)primaryTask=dispatch_queue_create(   "com.me.app.task1",backgroundPriorityAttr); 


dispatch_async(primaryTask,^{ 
      [self doSync]; 
     }); 
+0

如果過程過於密集和阻塞事件循環,然後再考慮將其分成處理的更小,時間片塊,使線程的事件循環繼續處理。 – TheDarkKnight

+0

永不睡覺。決不。 – matt

回答

0

嘗試在包裝的NSOperation您處理,並設置較低的QoS優先級。這裏有一些信息: http://nshipster.com/nsoperation/

這裏是我編寫的代碼示例。操作被觸發鑑於加載事件:

let processingQueue = NSOperationQueue() 

override func viewDidLoad() { 

    let backgroundOperation = NSBlockOperation { 
     //My very long and intesive processing 
     let nPoints = 100000000000 

     var nPointsInside = 0 

     for _ in 1...nPoints { 
      let (x, y) = (drand48() * 2 - 1, drand48() * 2 - 1) 
      if x * x + y * y <= 1 { 
       nPointsInside += 1 
      } 
     } 

     let _ = 4.0 * Double(nPointsInside)/Double(nPoints) 
    } 

    backgroundOperation.queuePriority = .Low 
    backgroundOperation.qualityOfService = .Background 

    processingQueue.addOperation(backgroundOperation) 
} 
+0

我在一個優先級的調度隊列中運行它 - 這似乎並沒有阻止可怕的「Caught burning他CPU」控制檯消息 – JeremyLaurenson

+0

試試這個代碼,它應該使用不同的機制。 –