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

前言

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

同步

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

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

代码实例:

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获取结果

异步-非阻塞

异步执行

回调

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOP封装进行批量的数据查询并填充

在我们日常的项目开发中&#xff0c;我们经常会遇到这样的问题。我们有一张用户表&#xff0c;用户表中有用户ID和用户名称。我们其他表中会记录我们当前操作人的ID&#xff0c;一般&#xff0c;我们会记录一个创建人ID和修改人ID。那么&#xff0c;这个时候问题来了&#xff0…

Java学习手册:数据库事务相关知识

一、事务的概念与特性 概念 &#xff1a;事务是数据库中一系列操作的集合&#xff0c;这些操作要么全部成功&#xff0c;要么全部失败&#xff0c;是一个不可分割的工作单位。例如&#xff0c;在银行转账系统中&#xff0c;从一个账户扣款和向另一个账户存款这两个操作必须作为…

java复杂度,包装类,泛型解析

如何衡量代码的好坏&#xff1f; 评价代码的好坏我们使用算法效率来判断&#xff0c;而算法效率分两种&#xff1a; 算法效率&#xff1a; 第一种是时间效率&#xff0c;第二种是空间效率&#xff0c;时间效率被称为时间复杂度&#xff0c;⽽空间效率被称作空间复杂度。 时间…

基于 SpringBoot + Vue 的校园管理系统设计与实现

一、项目简介 本系统以校园组织管理为主线&#xff0c;结合用户权限分离机制与模块化设计&#xff0c;实现对“单位类别、单位、通知推送、投票信息、用户回复”等内容的全流程管理&#xff0c;广泛适用于教育局、高校及下属组织的信息管理工作。 &#x1f3af; 项目亮点&…

iOS蓝牙技术实现及优化

以下是针对2025年iOS蓝牙技术实现的核心技术要点的深度解析&#xff0c;结合当前iOS 18&#xff08;推测版本&#xff09;的最新特性与开发实践&#xff0c;分模块结构化呈现&#xff1a; 一、硬件与协议层适配 BLE 5.3 支持 iOS 18默认支持蓝牙5.3协议&#xff0c;需注意&…

Qt 中实现观察者模式(Observer Pattern)

在 Qt 中实现**观察者模式(Observer Pattern)通常利用其内置的信号与槽(Signals & Slots)**机制,这是最符合 Qt 设计哲学的方式。以下是详细实现方法和关键点: —### 1. 观察者模式的核心思想- Subject(被观察者):维护一个观察者列表,在状态变化时通知观察者。- …

写程序,统计两会政府工作报告热词频率,并生成词云

import jieba from collections import Counter from wordcloud import WordCloud import matplotlib.pyplot as pltdef generate_wordcloud():try:# 读取文本文件with open(E:\\桌面\\s.txt, r, encodingutf-8) as file:text file.read()# 中文分词words jieba.lcut(text)# …

【Science Advances】普林斯顿大学利用非相干光打造可重构纳米光子神经网络

(导读 ) 人工智能对计算性能需求剧增&#xff0c;电子微处理器发展受功耗限制。光学计算有望解决这些问题&#xff0c;光学神经网络&#xff08;ONNs&#xff09;成为研究热点&#xff0c;但现有 ONNs 因设计缺陷&#xff0c;在图像分类任务中精度远低于现代电子神经网络&#…

gin + es 实践 01

项目结构说明 目录结构概览 Go-ES 项目采用领域驱动设计&#xff08;DDD&#xff09;架构&#xff0c;目录结构清晰&#xff0c;各层次职责分明。以下是项目的主要目录结构&#xff1a; go-es/ ├── cmd/ # 应用程序入口 │ └── api/ …

如何构建直播美颜SDK?从美颜API调用逻辑到GPU优化实战

随着短视频和直播行业的爆发&#xff0c;美颜SDK已成为各大直播平台的“标配”。从基础的磨皮、美白&#xff0c;到如今的AI滤镜、虚拟形象&#xff0c;这些功能的背后都离不开高效的美颜SDK支持。那么&#xff0c;如何构建一款性能优越、体验流畅的直播美颜SDK呢&#xff1f;本…

高组装导轨的特点

高组装导轨通常是四列式单圆弧齿形接触直线导轨&#xff0c;具有整合化的结构设计&#xff0c;适用于重负荷和精密应用。与其它直线导轨高组装导轨提升了负荷与刚性能力&#xff0c;具备四方向等负载特色和自动调心功能&#xff0c;能够吸收安装面的装配误差&#xff0c;达到高…

2025-05-07-FFmpeg视频裁剪(尺寸调整,画面比例不变)

原比例如图 原比例如图裁剪后的比例 代码&#xff1a; 方法一&#xff1a;极速 ffmpeg -i input.mp4 -vf "crop1080:750:0:345" -c:v libx264 -preset ultrafast -c:a copy output.mp4关键参数说明&#xff1a; vf “crop宽:高❌y”&#xff1a;定义裁剪区域。 …

一个.Net开源的协作办公套件,包括文档、表格、演示文稿和表单

从零学习构建一个完整的系统 推荐一个开源的文档协作办公套件&#xff0c;可以很好的满足团队对方便、高效、安全的方式来处理文档工作&#xff0c;促进团队协作和信息共享。 项目简介 ONLYOFFICE 是一个开源的办公套件&#xff0c;包括文档、表格、演示文稿和表单等应用程序…

虚幻基础:硬件输入

文章目录 triggered&#xff1a;按下一直触发 等于tickcompleted&#xff1a;必须等到triggered结束后 才触发松下triggered结束 默认按键触发顺序按下&#xff1a;触发两个先 Started后 Triggered 松开Completed 触发器&#xff1a;用于修改triggered 触发和结束驱动阈值&…

Python中的global与nonlocal关键字详解

一、前言 在Python编程中&#xff0c;变量作用域是一个非常重要的概念。对于初学者来说&#xff0c;经常会遇到在函数内部无法修改外部变量的问题。这时候&#xff0c;global和nonlocal关键字就能派上用场了。本文将详细介绍这两个关键字的用法、区别以及适用场景&#xff0c;…

vue-qr生成的二维码增加下载功能

大家好&#xff01;今天给大家分享一个超实用的前端小技巧——如何在 Vue 项目中生成二维码并实现下载功能。这个功能在分享链接、活动推广等场景特别有用&#xff0c;一起来学习吧&#xff01; &#x1f50d; 功能预览 使用 vue-qr 生成美观二维码点击按钮即可下载 PNG 格式的…

嵌入式C进阶路线指南

嵌入式是工科&#xff0c;工科讲究实践。说的再多、懂得再多&#xff0c;不能做出实际的东西&#xff0c;是没有意义的。学习嵌入式的核心原则之一就是多动手写代码。另外还有一个原则就是&#xff1a;从浅到深学习。接下来的内容将贯彻这两个原则。最后强调一点&#xff0c;各…

服务器上机用到的设备

服务器上机通常需要以下硬件设备&#xff1a; 服务器主机&#xff1a; CPU&#xff1a;选择高性能的多核处理器&#xff0c;如英特尔至强&#xff08;Xeon&#xff09;系列或AMD EPYC系列&#xff0c;以满足高并发和多任务处理需求。 内存&#xff08;RAM&#xff09;&#xf…

FreeCAD傻瓜教程-涡轮蜗杆的快速绘制FCGear工作台的使用方法

起因&#xff1a;涡轮蜗轴的组合&#xff0c;是一种比较简单且高效的传动结构。可以实现减速、加速、转动角度的放大、缩小等应用。 如何绘制呢&#xff1f;我搜索了不少教程&#xff0c;看起来都挺复杂的&#xff0c;对于小白来说有点像天书。这里介绍和记录一下利用FreeCAD 的…

daplink开发_一次开发DAPLink的详细开发流程及调试步骤

以下是针对第一次开发DAPLink的详细开发流程及调试步骤,结合STM32平台特性,分阶段指导您完成从零到一的完整开发过程: 一、开发流程1. 硬件准备阶段选型STM32芯片:推荐型号:STM32F103C8T6(成本低、资源足够)、STM32F405RGT6(性能更强,支持更多外设)。关键外设需求:U…