四、同步方法与异步方法及回调函数

2023-11-04

解释一下同步方法与异步方法以及回调函数的关系。若不想很深入的了解这方面内容,可以记住以下结论:

  1. 对于同时有同步方法和对应异步方法的函数,我们常用异步方法,用独立线程去处理该函数,提高用户的体验。
  2. 异步方法由于我们需要等待某种事件的发生(例如当前例子中accept等待有网络进程请求连接),而在发生之后我们也需要针对发生的情况进行一些操作,因此我们使用回调函数,回调函数是指发生事件后进行调用的对应函数,可以在回调函数中写你希望程序运行的一切语句。

首先,我们先思考一下我们平时程序的运行是什么样子的?是不是一段程序从头运行到尾,在不包含选择条件等语句的情况下第一行还没运行完第二行是绝对不会运行的。例如以下的例子:

	For (i=1;i<=10000000;i++) ans++;
	ans=0;

我们发现,第一行一共要运行10000000而且从整个程序上来看,第一行的运行结果是没有影响的,因为无论得到的是几,在第二行都会被归零。但由于计算机程序是从头到尾依次运行的,所以第一行没运行完第二行是绝对不会运行下去的。

而我们回到之前的问题同步方法和异步方法之间的差异。同步方法其实就是严格按照程序运行规则的方法,例如recv(),我们试想一下,在客户端程序如果客户端希望收到服务器发来的消息而用recv()函数,但用户却不知道什么时候服务器会发消息过来,整个程序就会阻塞在这一句语句,不会运行后面的语句,直到收到服务端的程序。可能几秒钟的等待还可以接受,但如果服务器超过三十四十分钟才有消息发送过来呢?整个程序会卡成未响应一直等着而不运行其他操作,这样可能会把用户逼疯吧。

而异步方法则不同,在运行完这这一语句之后,独立打开一个线程来等待事件的发生,而整个程序是照常运行的,不会卡成无响应状态。而是流畅运行。同时,当事件发生时,异步方法会运行一遍回调函数,运行回调函数则标记着该事件已成立,用上面的例子来说就是已经等到了有网络进程请求连接该服务器。通过在回调函数中展示或进行相应操作既可以“偷偷”完成刚刚本应顺序完成的任务,同时整个程序也不会卡住。下图通过时间与代码执行过程两个维度解释了同步方法与异步方法的差异:

在这里插入图片描述

以下也给出一个最简单的例子。我们假设计算一个值,计算这个值可能需要用到三十秒左右,是一个比较难算的值。其中有两种方法,同步方法count()与异步方法BeginCount(). 下面我们看看:

使用同步方法:
Printf(“正在为你计算结果,请稍等”);
	Ans=Count();		//等待30s,期间不能做任何其他事情
	Print(Ans);
	Login();  //录入用户信息,与count()无关。

Printf(“正在为你计算结果,请稍等”);
Ans=Count(); //等待30s,期间不能做任何其他事情
Print(Ans);
Login(); //录入用户信息,与count()无关。

使用异步方法:
'`Printf(“正在为你计算结果,你可以先进行其他操作”);
	BeginCount(Countcallback);		//运行这一语句本身无需等待。
	Login();

	Void countcallback(int ans){		//回调函数,ans本身作为回调函数的传参
		Printf(“ans”);
	}`

以上一段代码是一段异步方法的代码,也就是说调用begincount的过程中本身是不会有太大的时间消耗的,可以马上执行下面的login()操作,而是等待三十秒后会自动调用函数countcallback,而其中的计算结果一般也会以传递参数的方式传递给回调函数,在回调函数中即可根据需要进行一系列的操作,当然最简单就是和上面一样输出答案。这样就大大减少了用户无意义的等待时间,可以让用户有更好的程序使用体验。

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

四、同步方法与异步方法及回调函数 的相关文章

  • 分辨公网IP和内网IP的方法

    公网IP一般就是对外的访问地址 内网IP就是对内的访问地址 两者的使用范围是不一样的 那如果区分客户网络的IP地址是公网IP地址还是内网IP地址呢 公网IP的地址范围是很广泛的 我们可以先了解下内网IP 因为内网IP的地址段相对是局限的 一
  • 双系统安装win7出现grub怎么解决

    我们在重装系统时 特别苹果装双系统时 会出现安装过程或者安装后的问题 发现系统开机显示grub 导致不能正常进入系统 让人很是着急 其实出现这种情况是因为系统找不到主引记录所导致 只要重建主引记录mbr即可解决 下面小编就教教大家win7系
  • 实时获取建材网商品数据:API实现详解与代码示例

    一 引言 随着电子商务的快速发展 实时获取商品数据对于企业决策 市场分析以及数据驱动的营销策略至关重要 建材网作为国内知名的建材信息平台 提供了API接口 使得第三方开发者可以方便地获取商品数据 本文将详细介绍如何使用 建材网的API接口
  • 第二节课内容学习

    监听远程端口 并映射到本地 先配置ssh的公私钥非对称加密 假设远程开放的端口为33090 在本地计算机终端执行 ssh CNg L 6006 127 0 0 1 6006 root ssh intern ai org cn p 33090
  • 小白成功搭建Elasticsearch 只需五步(包含配置xpack)

    ElasticSearch 安装成功后 是不需要使用用户名和密码就可以访问的 这也是在配置skywalking的apm过程中 连接es数据库无需设置用户名和密码的原因 启动es也非常的简单 在 bin 目录下运行elasticsearch
  • “性能压测揭密:关键指标分析!“

    在进行全链路压测和性能测试时 需要关注多个关键性能指标 KPIs 来评估系统的性能表现 以下是一些常见的性能测试指标 1 吞吐量 Throughput 系统在单位时间内能够处理的请求数量或事务数量 通常以每秒请求数 RPS TPS 来衡量
  • 如何查看崩溃日志

    目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1 手机设置查看崩溃日志 方式2 Xocde工具 方式3 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四 控制台资源库 线上崩溃日志 线上监听crash
  • DreadHunger恐惧饥荒海上狼人杀服务器搭建架设教程windows系统

    DreadHunger 恐惧饥荒海上狼人杀服务器搭建架设教程windows系统 大家好我是艾西 在11月底我有发文 DreadHunger 恐惧饥荒海上狼人杀官方停服的消息 当时在官方的公告模版中公布了在2024年一月一日会将服务端公开让喜
  • 数据采集才是MES系统的核心内容

    一 数据采集在MES管理系统中的应用 1 设备数据采集 MES管理系统通过与生产设备的连接 可以实时采集设备运行状态 产量 质量等相关数据 这有助于企业及时掌握设备运行状况 优化设备资源配置 提高设备利用率 2 工艺数据采集 MES管理系统
  • Linux 系统日志及其归档

    主要记录Linux 系统需要关注的日志文件 以及日志归档服务 rsyslogd 系统日志服务 rsyslogd 日志服务 rsyslogd reliable and extended syslogd 可靠 可扩展的系统日志服务 Rsyslo
  • 【镜像压缩】linux 上 SD/TF 卡镜像文件压缩到实际大小的简单方法(树莓派、nvidia jetson)

    文章目录 1 备份 SD TF 卡为镜像文件 2 压缩镜像文件 2 1 多分区镜像文件的压缩 树莓派 普通 linux 系统等 2 2 单分区镜像文件的压缩 Nvidia Jetson Nano 等 3 还原镜像文件到 SD TF 卡
  • 如何解读服务器的配置和架构?

    在当今数字化时代 服务器作为企业或组织的重要基础设施 其配置和架构对于保障业务的稳定运行至关重要 如何解读服务器的配置和架构 成为了一个备受关注的话题 本文将围绕服务器配置和架构的解读进行深入探讨 帮助读者更好地理解服务器的性能 扩展性和安
  • 使用Hypothesis生成测试数据

    Hypothesis是Python的一个高级测试库 它允许编写 测试用例 时参数化 然后生成使测试失败的简单易懂的测试数据 可以用更少的工作在代码中发现更多的bug 安装 pip install hypothesis 如何设计 测试数据 通
  • 2种方法,教你使用Python实现接口自动化中的参数关联

    通常在接口自动化中 经常会参数关联的问题 那么什么是参数关联 参数关联就是上一个接口的返回值会被下一个接口当做参数运用 其中Python中可以实现参数关联的方法有很多种 今天小编给大家介绍下 如何通过Python来实现接口自动化中的参数关联
  • 步骤详图 教你在linux搭建容器环境

    警告 切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker 1 准备工作 系统要求 要安装Docker CE 社区版 操作系统的最低要求是CentOS7 7以下版本都不被支持 卸载旧版本 Docker改版
  • 什么是充放电振子理论?

    CHAT回复 充放电振子模型 Charging Reversal Oscillator Model 是一种解释ENSO现象的理论模型 这个模型把ENSO现象比喻成一个 热力学振荡系统 在这个模型中 ENSO现象由三个组成部分 充电 Char
  • Kubernetes (十一) 存储——Secret配置管理

    一 简介 从文件创建 echo n admin gt username txt echo n westos gt password txt kubectl create secret generic db user pass from fi
  • 服务器VPS是什么意思?一文了解其含义与重要性

    在今天的数字时代 服务器扮演着至关重要的角色 它们是网站 应用程序和在线业务的基石 但是 你是否听说过VPS 本文将深入探讨什么是服务器VPS 以及为什么它在今天的互联网世界中如此重要 什么是服务器VPS 服务器的基本概念 在我们深入探讨V
  • 内网安全:隧道技术详解

    目录 隧道技术 反向连接技术 反向连接实验所用网络拓扑图及说明 网络说明 防火墙限制说明 实验前提说明 实战一 CS反向连接上线 拿下Win2008 一 使用转发代理上线创建监听器 二 上传后门执行上线 隧道技术 SMB协议 SMB协议介绍
  • 高防服务器什么意思

    高防服务器什么意思 为什么要用高防服务器 小编为您整理发布高防服务器什么意思的解读 高防服务器是指具备较高防御能力的服务器 能够抵御DDoS CC等网络攻击 高防服务器通常用于保护游戏 APP 金融 电商等业务 这些领域因为其业务特性 容易

随机推荐

  • matlab 安装mingw64

    1 下载mingw64 MinGW w64 for 32 and 64 bit Windows download SourceForge net 解压到没有空格的路径 好像必须在c盘 否则可以出现 错误使用 configuremingw 无
  • List元素为类对象,按照类对象属性去重的解决办法

    很多小伙伴在开发中会遇到一个场景 就是List集合中存储的是类对象 我们想要根据类对象属性去重 这种场景该如何做呢 解决办法 大家都知道对象的equals默认是按照对象的应用地址去进行比较的 所以想要对象去重 关键就在于重写equals方法
  • 三极管驱动继电器详解

    http www 21ic com jichuzhishi analog basic 2015 08 24 638790 html
  • 基于STM32的多功能心电信号监测系统设计

    1 系统总体方案设计 系统由STM32F103微处理器模块 ADS1292R心电采集模块 LMT70体表温度传感器模块 ESP8266无线WiFi模块 MMA955L加速度计模块 系统电源 PC服务端等组成 STM32F103作为主控制器实
  • 2.4 Verilog HDL语句

    语句 1 赋值语句 结构说明语句 阻塞与非阻塞 1 1 赋值语句 1 1 1 连续赋值语句assign 1 1 2 过程赋值语局 和 lt 1 2 结构说明语句 1 2 1 结构说明语句always 1 2 2 结构说明语句initial
  • 【机器学习】噪声数据的理解

    文章目录 一 噪声数据 1 1 分箱 1 2 回归 1 3 聚类 1 4 其他 二 数据清理作为一个过程 2 1 偏差检测 2 1 1 使用 元数据 关于数据的数据 2 1 2 编码格式 存在使用不一致 数据表示不一致 2 1 3 字段过载
  • C语言编程中的8位、16位、32位整数的分解与合并

    在单片机的编程中对于8位 16位 32位整数的分解与合并用的比较多 今天做了简要学习 后面还需要加以总结 练习在VC 6 0编程环境中进行 源程序 include
  • pikachu靶场--SQL inject--数字型(post)/字符型(get)/搜索型/xx型注入【4.1】~【4.4】

    目录 一 概述 二 数字型注入 post 三 字符型注入 get 四 搜索型注入 以搜索k为例 五 xx型注入 一 概述 在owasp发布的top10排行榜里 注入漏洞一直是危害排名第一的漏洞 其中注入漏洞里面首当其冲的就是数据库注入漏洞
  • python 变量赋值 修改之后 原值改变

    python 是一种动态语言 因此变量的类型和值 在运行时均可改变 当我们将一个变量赋值给另一个变量时 实际上是将变量的引用地址传递给新的变量 这意 味着新旧变量将指向同一个位置 因此 在更改其中一个变量的值时 另一个变量的值也会被更改 i
  • pig对应sql的基本命令

    1 从文件导入数据 1 Mysql Mysql需要先创建表 CREATE TABLE TMP TABLE USER VARCHAR 32 AGEINT IS MALE BOOLEAN CREATE TABLE TMP TABLE 2 AGE
  • 【Java】final关键字的细节注意(八)

    这节内容较简单 而且内容较少 课程源自韩顺平老师的Java课程 final关键字的使用 final的需要注意的细节
  • Android UI 基础-坐标系、角度(弧度)、颜色

    目录 1 坐标系 1 1 屏幕坐标系和数学坐标系的区别 1 2 View的坐标系 1 3 MotionEvent中 get 和 getRaw 的区别 1 4 核心要点 2 角度与弧度 2 1 角度与弧度的定义 2 2 角度和弧度的换算关系
  • linux 进入目录命令

    直接进入计算机目录下 常用指令 cd home 进入 home 目录 cd 返回上一级目录 cd 返回上两级目录 cd 进入个人的主目录 cd user1 进入个人的主目录 cd 返回上次所在的目录 ls 显示文件或目录 l 列出文件详细信
  • 移动端常见meta设置

    1 设置viewport 这句话设置viewport的宽为设备的宽 禁止用户进行缩放 此外 常见参数设置 a width 宽度 数值 device width 默认为980 b height 高度 数值 device height c in
  • 手写一个根据目录自动生成的路由

    文章目录 一 起因 二 思索 三 测试效果 四 项目代码 一 起因 最近研究了一下阿里dva的quickstart 其中路由配置是手动添加 如下 先将要显示的页面导入router js 然后配置 其中path products 是配置的路由
  • 在pycharm中配置变量

    实验目的 python run classifier py task name MRPC do train true do eval true data dir GLUE DIR MRPC vocab file BERT BASE DIR
  • es 索引类型与分词器调整与迁移

    索引最好起别名 方便索引调整 1 创建新索引 PUT index v2 settings number of shards 5 number of replicas 1 mappings doc dynamic strict propert
  • Python爬虫中文乱码问题

    我们在爬虫输出内容时 常常会遇到中文乱码情况 以如下网址为例 https chengdu chashebao com yanglao 19077 html 在输出内容时 出现如下图的情况 解决爬虫中文乱码的步骤 网址编码为gbk 查看网页源
  • shell与shell脚本(一)基本概念与常用的shell命令

    前言 像linux windows等的操作系统 都很大程度上地便利了我们操作计算机的能力 计算机之所以能高效处理用户指令 是因为CPU 更细致地讲 是因为CPU中的内核 也就是我们所说的运算器 控制器和寄存器 当然 我们在使用计算机是 不可
  • 四、同步方法与异步方法及回调函数

    解释一下同步方法与异步方法以及回调函数的关系 若不想很深入的了解这方面内容 可以记住以下结论 对于同时有同步方法和对应异步方法的函数 我们常用异步方法 用独立线程去处理该函数 提高用户的体验 异步方法由于我们需要等待某种事件的发生 例如当前