【问题标题】:Command line tool running slowly from NSTask but fast from Terminal [closed]从 NSTask 缓慢运行但从终端快速运行的命令行工具 [关闭]
【发布时间】:2019-07-31 10:17:26
【问题描述】:

我编写了一个命令行工具,通常需要 15-20 秒才能完成。

在执行任务时,它至少每秒通过stdout 输出一次进度。

当我从 Terminal.app 运行命令时,它会尽可能快地执行,例如不到 20 秒。

但是当我通过我的 GUI 应用程序通过 NSTask 运行它时,该工具至少需要 3-5 倍的时间。

GUI 应用使用NSPipeNSFileHandleReadCompletionNotification 上的观察者来监控工具的输出,并且该输出经常到达(例如,至少每秒)。

我尝试将NSTaskqualityOfService 属性设置为更高的值(最高为0x21)而没有任何改进。

任务从线程启动(通过performSelectorInBackground 调用)并通过调用其waitUntilExit 方法等待任务完成。

我检查了活动监视器:

  • GUI 应用和工具都不会进入 App Nap 模式。
  • 我可以看到,当从终端运行时,该工具使用恒定的 30% 的 CPU 时间,而从 GUI 应用程序运行时,通常会降至 10% 以下。

我在 10.13.6 上在两台配置非常不同的计算机上看到了这个问题。我还没有机会在其他操作系统版本上进行测试,但如果它在 10.13 中不能正常工作,那已经够糟糕了。

什么可能导致该工具被这样限制?

该工具大部分时间都在内核中,因为它调用searchfs(),它广泛扫描文件系统。我想知道这是否是问题的一部分。

另外,有人可以建议以让 GUI 应用程序控制其生命周期(即它应该作为子进程运行)的方式运行该工具的替代方案,让它将参数传递给该工具并读取其标准错误和标准输出管道?

【问题讨论】:

  • 如果你真的想删除你的问题,不要删除它的内容并要求投票,mod-flag 解释情况以及你为什么希望它被删除。并且答案(你犯了一个错误)应该作为答案添加,而不是对问题的编辑。

标签: macos child-process nstask


【解决方案1】:

您始终可以通过以下方式启动 NSTask 来增加它的优先级:

nice -n *priority* *command* *arguments* 

其中优先级必须为负数,最大为 -20,负数越大,优先级越高。

但是,您需要超级用户权限才能启动这样的命令。

你可以在这里阅读:

https://ss64.com/osx/nice.html

或这里:

https://superuser.com/questions/42817/is-there-any-way-to-set-the-priority-of-a-process-in-mac-os-x

【讨论】:

  • 谢谢。但事实证明我犯了一个错误,将错误的参数传递给我的工具 - 这导致它需要更长的时间。所以,NSTask 没有错。出于这个原因,我想删除这个问题,但我不能,因为它现在有答案了。哦,好吧。
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多