Swift 并发 - 非阻塞 sleep()?

Bra*_*key 3 asynchronous async-await swift

Swift 可以访问 Darwin 的sleep调用,使用起来很简单:

sleep(10) // waits for 10 seconds, but blocks the thread
Run Code Online (Sandbox Code Playgroud)

但是,这会阻塞当前线程。现在 Swift 已经支持async/await是否有一个内置的、非阻塞的sleep方法,不会挂起当前线程?

// what I'm looking for:

func doWork() async {
    // ...
    await sleep(10) // lightweight, does not block thread
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

Bra*_*key 6

找到了。(Swift 标准库的一部分)有一个内置方法Task提供了这种休眠功能来挂起当前任务而不阻塞线程。Swift 运行时通过在运行时添加一个“暂停点”来实现这一点,这样线程就可以自由地执行其他代码,并且只有在任务恢复时才会返回到该函数。

“任务”是 Swift 的“结构化并发”提供的一个构造,用于帮助同时分派多个工作负载。其他感兴趣的人可以在这里阅读更多相关信息

func doWork() async {
    // ...
    await Task.sleep(for: .seconds(1)) // lightweight, does not block thread
    // ... 
}
Run Code Online (Sandbox Code Playgroud)