macos nanosleep()睡得太久了

时间:2018-01-16 16:14:14

标签: macos posix grand-central-dispatch usleep

从概念上讲,我运行以下Swift伪代码来调节UDP发送的数据比特率

let sendQueue = DispatchQueue(label: "_send_queue", qos: .userInitiated)
sendQueue.async {
    for data in datas {
        socket.send(data)

        if let timespec = getTimeToSleep() {
            var ts = timespec
            nanosleep(&ts, nil) 
        }
    }
}

在我的情况下,睡眠时间通常约为0.001秒。一般来说,nanosleep()的实际支出高出几个百分点。到目前为止一直很好 - 但是经过一段时间nanosleep()在很长一段时间后返回 - 很容易就是几秒甚至一分钟。我很确定我没有要求这么长的间隔。我试过没有结果

  • 使用release config
  • 构建应用
  • 在调试程序外运行应用程序

如果从调试器运行时发生这种情况有什么奇怪的 - 当我暂停并恢复应用程序时,它会再运行一段时间。

任何线索?

1 个答案:

答案 0 :(得分:0)

啊,发现了这种行为的原因。 macOS应用程序小睡正在导致此问题。

执行

serverActivity = ProcessInfo().beginActivity(options: ProcessInfo.ActivityOptions.userInitiated, reason: "Serving Fast Data")

在我开始提供UDP数据之前,所有这些都能够及时稳定地完成。