我理解异步Swift Task不应该阻塞(异步工作线程必须始终向前推进).如果我有一个Task%异步的Swift应用程序,但需要引入一些阻塞任务,那么正确的方法是什么,它不会阻塞任何Swift异步线程池工作线程?

我假设需要异步线程池之外的一个新的专用线程,如果该假设正确,那么异步函数等待该线程完成的线程安全方式是什么?我可以使用withCheckedContinuation的主体启动一个线程,将continuation句柄复制到该线程中,并在完成时从该线程调用continuation.resume吗?

推荐答案

我理解异步Swift任务不应该阻塞(异步工作线程必须始终向前推进).

这是正确的.Swift并发系统的基石是任务必须始终向前推进.

我可以使用withCheckedContinuation的主体来启动一个线程,将延续句柄复制到该线程并调用延续吗.完成后从该线程继续?

是的,这也是正确的,这正是延续的目的:

CheckedContinuation
A mechanism to interface between synchronous and asynchronous code, logging correctness violations.

继续的目的是让您将阻塞同步操作适应async世界.当你打withCheckedContinuation,它

[s] uspends当前任务,然后调用给定的闭包,并为当前任务判断continuation.

任务将无限期暂停,直到您恢复它,这允许其他任务在此期间取得进展.您获得的继续值是一个线程安全接口,用于指示阻塞操作已完成,并且原始任务应在下一个可用机会时恢复.延续也是Sendable,这表示可以在线程之间安全地传递它.任何线程都可以继续执行任务,因此您甚至不必回调同一线程上的继续.

SE-0300: Continuations for interfacing async tasks with synchronous code的用法示例:

func operation() async -> OperationResult {
  // Suspend the current task, and pass its continuation into a closure
  // that executes immediately
  return await withUnsafeContinuation { continuation in
    // Invoke the synchronous callback-based API...
    beginOperation(completion: { result in
      // ...and resume the continuation when the callback is invoked
      continuation.resume(returning: result)
    }) 
  }
}

请注意,这仅适用于真正阻塞的任务,并且在完成它们所依赖的某些任务之前无法取得进一步的进展.这与执行主动计算的任务不同,主动计算恰好需要很长的时间,因为这些任务至少正在取得主动进展.(但在聊天中,你澄清你的用例是前者.)

Swift相关问答推荐

如何将泛型函数存储到变量中?

TimeZone 背后的目的

使用索引来访问 libc 定义的元组

减小SF符号的边框宽度

如何在 Swift 中做类型安全的索引?

将 ArgumentParser 与 Swift 并发一起使用

Swift Random Float Fatal Error:在无限范围内没有均匀分布

SwiftUI View .tint(_ Color) 方法不起作用

如何从数据中读取以空结尾的字符串?

类型 '()' 不能符合 View (除非它肯定是 View,这次没有恶作剧)

Vapor - 流利的,将对象保存到 PostgreSQL

Alamofire 会自动存储 cookie 吗?

使 struct 可散列?

如何从元组数组创建字典?

Swift 中惰性 var 的优势是什么

如何在 GCD 中停止 DispatchWorkItem?

Facebook SDK 4.0 IOS Swift 以编程方式注销用户

如何在 SwiftUI Segmented Picker 中更改选定的段 colored颜色

UITableView 布局在 push segue 和 return 上搞砸了. (iOS 8、Xcode beta 5、Swift)

iPhone 纵向和 iPad 横向的通用应用程序