【发布时间】:2019-07-31 10:17:26
【问题描述】:
我编写了一个命令行工具,通常需要 15-20 秒才能完成。
在执行任务时,它至少每秒通过stdout 输出一次进度。
当我从 Terminal.app 运行命令时,它会尽可能快地执行,例如不到 20 秒。
但是当我通过我的 GUI 应用程序通过 NSTask 运行它时,该工具至少需要 3-5 倍的时间。
GUI 应用使用NSPipe 和NSFileHandleReadCompletionNotification 上的观察者来监控工具的输出,并且该输出经常到达(例如,至少每秒)。
我尝试将NSTask 的qualityOfService 属性设置为更高的值(最高为0x21)而没有任何改进。
任务从线程启动(通过performSelectorInBackground 调用)并通过调用其waitUntilExit 方法等待任务完成。
我检查了活动监视器:
- GUI 应用和工具都不会进入 App Nap 模式。
- 我可以看到,当从终端运行时,该工具使用恒定的 30% 的 CPU 时间,而从 GUI 应用程序运行时,通常会降至 10% 以下。
我在 10.13.6 上在两台配置非常不同的计算机上看到了这个问题。我还没有机会在其他操作系统版本上进行测试,但如果它在 10.13 中不能正常工作,那已经够糟糕了。
什么可能导致该工具被这样限制?
该工具大部分时间都在内核中,因为它调用searchfs(),它广泛扫描文件系统。我想知道这是否是问题的一部分。
另外,有人可以建议以让 GUI 应用程序控制其生命周期(即它应该作为子进程运行)的方式运行该工具的替代方案,让它将参数传递给该工具并读取其标准错误和标准输出管道?
【问题讨论】:
-
如果你真的想删除你的问题,不要删除它的内容并要求投票,mod-flag 解释情况以及你为什么希望它被删除。并且答案(你犯了一个错误)应该作为答案添加,而不是对问题的编辑。
标签: macos child-process nstask