有没有办法让线程运行缓慢?

时间:2014-03-07 15:09:40

标签: objective-c multithreading grand-central-dispatch nsoperationqueue

这个问题可能与每个开发人员都希望他们的系统做的事情相反。

我正在创建一个软件,该软件可以查看特定文件的目录并将其读入并执行某些操作。这可能会产生高CPU负载。我使用GCD来创建放入NSOperationQueue的线程。我想知道的是,是否有可能使这个操作不占用这么大的CPU负载?我希望运行速度慢,因为速度不是问题,但应用程序应该在后台运行非常好非常重要。

简而言之。我可以让NSOperationQueue或线程一般慢慢运行而不使用睡眠之类的东西吗?

应用程序遍历目录结构,查找所有图像并创建缩略图。只需遍历目录就可以使CPU负载很高。

2 个答案:

答案 0 :(得分:0)

流程优先级:nice / renice。

请参阅: https://superuser.com/questions/42817/is-there-any-way-to-set-the-priority-of-a-process-in-mac-os-x#42819 但你也可以通过编程方式完成。

您的线程是CPU密集型的。这导致两个问题:

  1. 他们是否需要如此CPU密集型?他们在做什么,这是CPU密集型的?描述代码。当你使用线性算法时,你是否正在使用(比方说)二次算法?

  2. 与包装盒上的其他进程很好地配合使用。如果盒子上没有其他东西那么你/想要/使用所有可用的CPU资源:否则你只是在浪费时间。但是,还有其他东西在运行然后你想要推迟(在合理范围内),这意味着给你的进程一个比其他进程更低的优先级(即/更高/更好的值)。默认情况下,进程的值为0,所以只需将其设置得更大(比如说+10)。你必须是root才能让流程变得消极。

答案 1 :(得分:0)

并发编程指南中的Operation Queues部分介绍了更改NSOperation优先级的过程:

  

更改基础线程优先级

     

在OS X v10.6及更高版本中,可以配置操作的基础线程的执行优先级。系统中的线程策略本身由内核管理,但通常优先级较高的线程比较低优先级的线程有更多的运行机会。在操作对象中,将线程优先级指定为0.0到1.0范围内的浮点值,其中0.0是最低优先级,1.0是最高优先级。如果未指定显式线程优先级,则操作将以默认线程优先级0.5运行。

     

要设置操作的线程优先级,必须先调用操作对象的setThreadPriority:方法,然后再将其添加到队列中(或手动执行)。当执行操作时,默认的start方法使用您指定的值来修改当前线程的优先级。此新优先级仅在操作主要方法的持续时间内有效。所有其他代码(包括操作的完成块)都使用默认线程优先级运行。如果创建并发操作,并因此覆盖start方法,则必须自己配置线程优先级。

话虽如此,我不确定通过调整线程优先级你会看到多少性能差异。对于更戏剧性的性能更改,您可能必须使用计时器,睡眠/暂停线程等。

如果您正在扫描文件系统以查找已更改的文件,您可能需要参考File System Events Programming Guide以获取有关响应文件系统更改的轻量级技术的指导。