库函数是否应该挂起或延迟返回

2024-06-27

假设我正在编写一个返回字符串的库,这是一项复杂且长时间运行的任务。

我可以选择提供此

interface StringGenerator {
   suspend fun generateString(): String
}

or

interface StringGenerator {
   fun generateString(): Deferred<String>
}

是否有任何(任一选项的缺点?它们是什么?我应该选择哪个?


Kotlin 协程的设计遵循“默认顺序” https://kotlinlang.org/docs/reference/coroutines/composing-suspending-functions.html#sequential-by-default指导方针。这意味着您的 API 应该始终公开suspend fun和用户,如果他们确实需要它,可以轻松地将它们包裹起来async.

其优点类似于cold流量相对于hot流:可挂起的函数仅当控制在其内部时才处于活动状态。当它返回时,它没有留下在后台运行的任务。

每当您返回一个Deferred,用户必须开始担心如果他们不能等待结果会发生什么。某些代码路径可能会忽略它,调用代码可能会出现异常,然后他们的应用程序就会发生泄漏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

库函数是否应该挂起或延迟返回 的相关文章

随机推荐

  • 如何使用Conda安装MySQLdb?

    我已经阅读了有关如何安装 MySQLdb 的几种不同的解释 但我不确定哪种情况适用于我 因为我的错误消息不同 我的系统似乎找不到 MySQLdb 我安装了 pymysql 但我需要导入 MySQLdb 才能使用该库中的过程 感谢您的帮助 c
  • 在vim中查找精确匹配

    Using or 能够在 vim 中找到单词的匹配项 但我怎样才能找到完全匹配的呢 例如 我的文本包含以下单词 a aa aaa aaaa aa我输入 aa这将找到包含模式 aa 的所有字符串 但是如果我想准确找到怎么办aa并不是aaaa
  • 如何在使用可变宽度描边绘制时使绘制路径平滑

    我创建了一个示例绘图应用程序 用户可以使用可变宽度描边进行绘制 到目前为止 使用可变描边绘制路径是有效的 但绘制的线条并不平滑 我用来实现这一目标的代码如下所示 帮我解决这个问题 因为我在过去两天一直坚持这个问题 使用可变笔划宽度绘制路径的
  • 在无头 Chrome Docker 中获取运行 selenium 的空页面

    我正在基于 Oracle Linux 的 Docker 中的无头 chrome 中运行测试用例 我请求的页面应该重定向到带有用户名密码字段的身份验证页面 但我在 docker server 中收到空白页面 这在我的 MacBook 上运行得
  • 如何使用 GitLab 管道中的密钥通过 SSH 连接到目标服务器?

    当 GitLab 管道成功时 我想通过 SSH 使用公钥连接到服务器 正如我所看到的 我需要在 GitLab 端使用 ssh keygen 生成一个密钥并将其添加到我想要连接的服务器上 我可以在管道期间生成密钥 但由于公钥未添加到目标服务器
  • 错误:(1) 处的分配中的等级 0 和 1 不兼容

    我正在不规则网格上使用有限差分方法 这是代码的重要部分 IMPLICIT DOUBLE PRECISION A Z REAL 16 IPSI ICORR POT 20000 VA 20000 delta1 20000 delta2 2000
  • Signalr 客户端在重新连接时检索丢失的消息

    我希望用户在重新连接到 Signalr 服务器时检索他们可能错过的消息 我知道我可以独立于 Signalr 保留消息 跟踪客户端中收到的最后一条消息 ID 并在重新连接时重新发送较新的消息 但我正在查看 SqlServer 背板的 Mess
  • 将 32 位值加载到 Arm 汇编中的寄存器中

    我想使用arm汇编将1个32位十六进制直接加载到寄存器中 mov r1 0x6c617669 这不能使用 因为从该指令我们只能加载 8 位值 所以我直接从内存加载32位值 那么如何将32位值存储在内存中并使用arm汇编将其直接加载到寄存器中
  • 使整个网页着色

    How I can take any given webpage and make everything look tinted a certain color Basically if you take google and tint i
  • Webpack 文件加载器忽略 PNG 文件

    我试图通过 webpack 文件加载器输出所有图像文件 但是 webpack 会忽略带有 PNG 扩展名的图像 配置在 JPG 文件上正常工作 我的网络包配置 const path require path const PATHS src
  • 用于启用扩展序列化调试信息的 Java 标志

    我目前正在努力解决 tomcat 上复杂对象的 HTTP 会话复制问题 一些对象实现Serializable但持有不可序列化的成员 不幸的是 默认情况下 堆栈跟踪不会提供太多有用的信息 有一个标志 XX 启用详细类名当发生 NotSeria
  • 未捕获的 ValueError:mysqli_stmt::execute():参数 #1 ($params) 必须是列表数组

    我试图通过这两个查询在我的数据库中插入准备好的语句多个值 这两个查询都发生故障 返回 未捕获的错误 调用未定义的方法 mysqli stmt bindValue 对于第一个代码或 未捕获的 ValueError mysqli stmt ex
  • 如何在CSS中嵌套多个计数器?

    我想用 CSS 嵌套两个不同的编号 以获得如下所示的自动编号 1 第 1 节 1 1 小节1 1 2 小节1 2 第 2 节 2 1 小节2 2 2 小节2 这是我实现这一目标的尝试
  • 移动设备和浏览器上屏幕方向不同的 javascript/jQuery 函数

    免责声明 我不是 javascript 或 jQuery 专家 这可能是一个很容易解决的问题 因为这只是我无法解决的一个小问题 我正在实现一个网站 如果浏览器处于横向模式 则该网站是水平的 如果浏览器处于纵向模式 则该网站是垂直的 CSS
  • 当通过 Jquery 将当前页面的 html 传递到托管 bean 时,primefaces RemoteCommand 标记不起作用

    我正在使用 Jquery 的 html 方法获取当前页面的 HTML 如下所示
  • 绑定到后面代码中的相对源

    在我的 UserControl 中 我的 XAML 中有以下代码
  • 如何检测uwp中某个点下的控件

    我的应用程序中的画布上布置了一系列控件 我正在以编程方式在画布上生成一个点 我希望检测画布的子元素是否与该点相交 我期望有一个命中测试 API 可用 wpf 曾经有一个可用的接口 但看起来所有交互似乎都是通过输入和触摸事件进行的 这使得我自
  • 请求中包含的安全令牌已过期

    我有一个脚本 可以从 Cloudwatch 中提取大量指标以用于我们自己的内部报告 该脚本会迭代特定区域中的所有 EC2 实例 并请求过去 2 周的 5 个 cloudwatch 指标 所有可用的统计数据 每次以 5 分钟为间隔返回 5 天
  • Powershell命令Publish-AzWebApp未发布应用程序

    我有一个 Net 6 Web API 应用程序 我可以通过 Visual Studio 2022 将其发布到 Azure 应用程序服务 然后使用该应用程序 现在我想自动化它 我的 powershell 创建了一个 zip 文件 其中包含所有
  • 库函数是否应该挂起或延迟返回

    假设我正在编写一个返回字符串的库 这是一项复杂且长时间运行的任务 我可以选择提供此 interface StringGenerator suspend fun generateString String or interface Strin