当前位置: 首页 > wzjs >正文

php开源公司网站网站排名怎么搜索靠前

php开源公司网站,网站排名怎么搜索靠前,乐陵seo推广,怎么做淘宝链接网站异步编程的两种场景 在异步编程中,回调函数通常服务于两种不同场景: 一次性资源获取:等待异步操作完成并返回结果。持续事件通知。监听并响应多个状态变更。 Kotlin为这两种场景提供了解决方案:使用挂起函数简化一次性资源获取…

异步编程的两种场景

在异步编程中,回调函数通常服务于两种不同场景:

  1. 一次性资源获取:等待异步操作完成并返回结果。
  2. 持续事件通知。监听并响应多个状态变更。

Kotlin为这两种场景提供了解决方案:使用挂起函数简化一次性资源获取,使用流处理持续事件通知。关于事件流处理方案详见《将listener转换为事件流》一文。本文聚焦第一种场景:如何简化异步资源获取操作。

异步编程的挑战

异步获取资源接口一般会提供两个状态回调函数:

interface ResourceStateListener {fun onReady(resource: Resource)fun onGone(error: Throwable)
}

有些复杂接口可能提供更多回调函数:

interface ComplexResourceStateListener {fun onOpen(resource: Resource)fun onReady(resource: Resource)fun onError(error: Throwable)fun onConfigureFailure(errorCode: Int)fun onClose()
}

客户代码的核心需求是获取可用资源。根据奥卡姆剃刀“如无必要,勿增实体”的原则,可以将所有资源不可用状态onError/onConfigureFailure/onClose合并成一个:onGone。考虑到onOpen事件只和资源清理有关,不执行业务操作。因此我们真正要关心的只有onReady和onGone。

传统回调的困境

根据上面的例子,我们可以得到代码:

fun openResource(resId: String, listener: ResourceStateListener) { ... }val resId = "1"
openResource(resId, object: ResourceStateListener {override fun onReady(resource: Resource) { ... }override fun onGone(error: Throwable) { ... }
})

传统回调模式存在以下问题:

  1. 代码逻辑分散。资源申请逻辑、使用资源逻辑、错误处理逻辑、资源清理逻辑分割在不同上下文中,代码难以追踪资源状态变化的完整路径。
  2. 状态管理困难。客户代码需要引入额外的变量来在回调函数之间传递资源对象或状态信息,代码复杂度,容易出错。
  3. 容易泄露资源。由于代码分散,难以追踪状态变化的完整路径,很难正确释放资源。容易存在资源泄露或重复释放。
  4. 可读性和可维护性差。回调模式无法满足结构化编程的“单一入口,单一出口”要求,代码难以阅读、理解和修改。

从结构化编程的角度来看,传统回调模式将申请资源代码、使用资源代码和异常处理代码分散在不同的上下文中,无法形成单一入口单一出口的逻辑结构,几乎是现代版的goto变种。

以同步形式编写异步代码

重新观察获取资源的过程:

  1. 程序向系统提交资源申请。系统以异步方式处理申请。
  2. 程序等待系统通知申请结果。
  3. 程序根据结果执行操作。

考虑到Kotlin挂起函数和协程非常适合等待场景,我们可以构造一个挂起函数,发起异步请求后函数挂起,等待回调函数唤醒。对于onReady事件,通过resume唤醒,进入使用资源逻辑。对于onGone事件,通过resumeWithException唤醒,进入错误处理逻辑。同时利用结构化并发特性,在协程退出时清理资源。

suspend fun openResource(resId: String): Resource = suspendCancellableCoroutine { cont ->var internalRes: Resource? = nullval listener = object : ComplexResourceStateListener {override fun onOpen(resource: Resource) {internalRes = resource // 保存底层资源对象引用,必要时手动释放。}override fun onReady(resource: Resource) {if (cont.isActive) {cont.resume(resource) // 资源就绪,唤醒协程。}}override fun onError(error: Throwable) {if (cont.isActive) {cont.resumeWithException(ResourceUnavailableException("Resource error", error))}}override fun onConfigureFailure(errorCode: Int) {if (cont.isActive) {cont.resumeWithException(ResourceUnavailableException("Configuration failed: $errorCode"))}}override fun onClose() {if (cont.isActive) {cont.resumeWithException(ResourceUnavailableException("Resource closed prematurely"))}}}// 发起异步请求。resource.openResource(resId, listener)// 设置资源清理操作。cont.invokeOnCancellation {// 移除监听器,避免后续无效回调干扰和内存泄漏。removeStateListener(listener)// 释放底层资源对象。internalRes?.release()internalRes = null}// 协程在此挂起,等待唤醒。
}// 资源不可用异常
class ResourceUnavailableException(message: String, cause: Throwable? = null) : Exception(message, cause)

封装成挂起函数之后,就可以在协程中以同步的形式编码。

try {val res = openResource(resId)useResource(res)
} catch (e: Exception) {handleError(e)
}

可以看到,使用协程封装回调函数拥有以下优势:

  1. 同步风格代码。使用线性代码结构来表达业务逻辑,代码简洁、意图清晰、可读性良好。
  2. 逻辑完整。资源申请、使用、错误处理逻辑集中在同一个上下文中,理解和维护成本低。
  3. 资源安全。利用协程的invokeOnCancellation和结构化并发特性,​保证资源安全释放,减少资源泄漏风险。
  4. 错误处理简单。所有导致资源不可用的底层错误统一转换成语义清晰的单一异常,简化客户代码错误处理逻辑。
  5. 支持取消。利用协程的取消机制可以取消操作,释放资源。
  6. 接口简单。对客户代码屏蔽了复杂的底层细节,只发布一个简单的挂起函数,提高接口的易用性和语义清晰度。

通过使用协程进行封装,我们将原本支离破碎、难以管理的异步代码转变成结构清晰、资源安全、易于编写和维护的“同步”代码。即提升了开发效率,也大幅增强了程序健壮性。

参考资料

  • 协程指南
  • 将listener转换为事件流
  • 只崩溃软件
  • 我对续体传递风格CPS的理解
  • 结构化并发
  • 结构化并发(2)
http://www.dtcms.com/wzjs/195694.html

相关文章:

  • 上海网站建设到诺然百度竞价员
  • 网站如何运营网站关键词优化工具
  • 手机优化软件排行廊坊seo外包
  • 哈尔滨网络推广优化整站优化和单词
  • 小说网站防盗做的最好的是关键词查询的五种常用工具
  • 小城市做网站公司建设网站哪家好
  • 中国建设网官方网站地址泰州网站排名seo
  • 品牌广告网络推广优化培训
  • 长沙网页设计工资一般多少seo排名软件
  • 怎么提高网站浏览量东莞网站建设优化
  • 宁波做网站的哪个好作品推广
  • 免费个人网站注册深圳网络推广培训机构
  • 莒南县网站建设seo 页面
  • 灵犀科技网站建设头条新闻今日头条官方版本
  • 做微信的网站叫什么米培训机构优化
  • 做外贸怎么网站找客户信息win10优化
  • 嘉瑞建设集团有限公司网站技术培训学校机构
  • 做兼职网站设计关键词搜索工具
  • 建设银行官方网站登录网址推广软文怎么写
  • javaweb网站开发书籍seo做什么网站赚钱
  • 网站的维护工作内容优化流程
  • 如何建网站赚钱全网优化哪家好
  • 凯里市网站建设朝阳网站建设公司
  • 如何在百度推广自己的产品优化大师的功能有哪些
  • 企业注册号查询系统天津优化公司哪家好
  • 编程网站scratch深圳网络推广怎么做
  • html5网站开发前景怎么做网络推广优化
  • wordpress顶部浮动seo怎么读
  • 青岛做网站的公司哪家好一点百度关键词规划师工具
  • 网站里面的图片做桌面不清晰海外seo