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

同步 / 异步、阻塞 / 非阻塞

前言

同步异步,在计算机科学中是一个非常重要的概念。作为一位软件开发工程师,我们每天都在和同步和异步打交道。

同步

同步-阻塞,顾名思义,就是同步和阻塞。调用方法后,必须等到结果返回,才能继续执行别的任务。

现实生活类比:打电话,必须等到对方接听电话,才能继续说话。

代码实例:

package mainimport ("fmt""time"
)func main() {fmt.Println("开始执行同步阻塞任务...")// 模拟一个耗时的同步操作time.Sleep(2 * time.Second)fmt.Println("同步任务执行完成")// 在同步任务完成之前,这里的代码不会执行fmt.Println("继续执行后续操作")
}

同步-非阻塞(Sync-NonBlocking)

同步-非阻塞,调用方法后,不等结果返回,继续执行别的任务。
需要不断轮询,直到结果返回。会占用CPU资源。

现实生活类比:每隔一段时间你去看下外卖到了没有。

代码实例:

package mainimport ("fmt""time"
)func main() {fmt.Println("开始执行同步非阻塞任务...")done := falsestartTime := time.Now()// 模拟一个需要轮询检查的任务for !done {// 检查任务是否完成if time.Since(startTime) >= 2*time.Second {done = truecontinue}fmt.Println("轮询检查任务状态...")// 执行其他操作fmt.Println("执行其他任务...")time.Sleep(500 * time.Millisecond)}fmt.Println("同步非阻塞任务执行完成")
}

异步

异步-阻塞(Async-Blocking)

异步-阻塞,调用方法后,任务是异步的,但是调用者会阻塞等待结果返回。

现实生活类比:你你让你朋友(其它线程)去餐馆点外卖(异步任务),然后外卖员送餐上门。但你必须在家等着,不能去做其他事情。

代码实例:

package mainimport ("fmt""time"
)func main() {// 创建一个通道ch := make(chan string)// 启动一个goroutine执行异步任务go func() {// 模拟耗时操作time.Sleep(2 * time.Second)ch <- "异步任务完成"}()fmt.Println("等待异步任务完成...")// 主线程阻塞等待异步任务完成result := <-chfmt.Println(result)
}

异步-非阻塞(Async-NonBlocking)

异步-非阻塞,调用方法后,不等结果返回,继续执行别的任务,任务完成后通过回调函数通知调用者。

现实生活类比:你点了外卖,你继续工作,外卖员送餐上门后,外卖员会给你打电话通知你。

代码实例:

package mainimport ("fmt""time"
)func main() {// 启动一个goroutine执行异步任务go func() {// 模拟耗时操作time.Sleep(2 * time.Second)// 通过回调函数通知任务完成callback("异步任务完成")}()fmt.Println("继续执行其他任务...")// 让主线程等待一会,以便看到异步任务的结果time.Sleep(3 * time.Second)
}func callback(result string) {fmt.Println(result)
}

总结

类型

是否等待结果

是否可以做其他事情

调用方式

同步-阻塞

同步返回

同步-非阻塞

轮询

是,轮询期间可以做其他事情

主动轮询检查

异步-阻塞

异步执行

通过Future获取结果

异步-非阻塞

异步执行

回调

相关文章:

  • Ubuntu手动安装Consul 的详细步骤
  • Linux常用命令33——sudo授权普通用户执行管理员命令
  • go基于redis+jwt进行用户认证和权限控制
  • 【软件设计师:算法】3.排序算法
  • 服务器数据恢复—硬盘坏道导致EqualLogic存储不可用的数据恢复
  • [dify]官方模板DeepResearch工作流学习笔记
  • JGL021垃圾渗滤液小试实验装置
  • cuda程序兼容性问题
  • 虚拟环境直接使用模块 笔记
  • 多边形生成立面点云
  • eFish-SBC-RK3576工控板音频接口测试操作指南
  • AI——认知建模工具:ACT-R
  • Python cv2边缘检测与轮廓查找:从理论到实战
  • 「动态规划」线性DP:股票问题合集 / LeetCode 121|122|123|188 (C++)
  • ubuntu中解决matplotlib无法显示中文问题
  • 使用非常便捷,可以批量操作的小软件
  • windows10系统:如何使用电脑控制手机上多个应用程序(app)?
  • Spring Boot 多数据源事务管理
  • 获取嵌入(Embeddings)的方法与实践
  • CSRF 攻击:深入解析“借刀杀人“的请求伪造与防御之道
  • 阶跃星辰CEO姜大昕:追求智能上限仍是最重要的事,多模态的“GPT-4时刻”尚未到来
  • 美国再工业化进程需要中国的产业支持
  • 巴基斯坦外长:近期军事回应是自卫措施
  • 4月证券私募产品备案量创23个月新高,股票策略占比超六成
  • 101条关于减重的知识,其中一定有你不知道的
  • 遇冰雹天气,西安机场新航站楼成“水帘洞”