首页 > 编程语言 >IO及网络编程

IO及网络编程

时间:2024-10-26 18:47:31浏览次数:9  
标签:异步 函数 文件 编程 网络 callback 描述符 result IO

IO分类:分为BIONIO(同步非阻塞)AIO(异步非阻塞)
IO多路复用三种函数:selectpollepoll
一切程序皆文件,这样对于我们程序员来说,只需要open、read、write、close接口,即可完成全部操作。

文件描述符

FD,一个索引,内核中维护了一些数据结构,通过文件描述符能找到对应的文件,文件读写到了那里。
比如调用open(‘file:// ***’)函数,返回值就是对应的文件描述符,将来我们调用read()/ write()的时候,参数就是对应的文件描述符

传统的web服务器中,当我们三次握手成功后,通过调用accept函数,可以得到对应的文件描述符(进行网络通信的),也叫套接字
通过读写该文件描述符我就可以从客户端进行通信,服务端则是通过客户端发来的请求,去做某些逻辑。

这样的话,如果我将来有多个文件描述符需要去处理,如果用传统的阻塞读,效率会非常低。

引入了IO多路复用机制

我们将一堆文件描述符丢给内核,委托内核来帮我们处理,
如果将来文件描述符状态发生了变更(可读/写),则你再告诉我,然后内核就会返回出一个就绪的文件描述符列表

实现异步的方式主要在于父(主)进程,创建专门的(子)线程去处理请求,创建好之后立马返回。如果这个处理请求的函数来自于外部传入的参数,那么它就叫回调函数,反之就不叫回调函数。我们只是使用回调函数来处理请求,他无法帮我们实现异步。

是不是异步最重要的是看是否等待某个函数, 如果不等待某个函数而马上执行其他函数就是异步 所以实际上就算是单线程也是可以实现异步的,而不需要多线程(使用​编辑事件循环或者信号量)

同步、异步、回调函数的关系

用了回调函数不代表就是异步了,大部分场景还是要结合子线程去完成

定义一个回调函数

public interface Callback {
    void onResult(int result);
}

下面代码执行结果:
结果是8
同步

public class CallBackCase {
    public static void main(String[] args) throws InterruptedException {
        // 重写回调函数逻辑
        long startTime = new Date().getTime();
        Callback callback = result -> System.out.println("结果是: " + result);
        performOperation(5, 3, callback);
        long endTime = new Date().getTime();
        String str = endTime-startTime < 5000 ? "异步":"同步";
        System.out.println(str);
    }
    public static void performOperation(int a, int b, Callback callback) throws InterruptedException {
        int result = a + b;
        sleep(5000);
        callback.onResult(result);
    }
}

 下面代码执行结果:
异步
结果是8

  public static void main(String[] args) throws InterruptedException {
        // 重写回调函数逻辑
        long startTime = new Date().getTime();
        Callback callback = result -> System.out.println("结果是: " + result);
        new Thread(() -> {
            try {
                performOperation(5, 3, callback);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }).start();
        long endTime = new Date().getTime();
        String str = endTime-startTime < 5000 ? "异步":"同步";
        System.out.println(str);
    }

通过以上结论,如果只是单纯使用回调函数,不去开启子线程,那么无非就是在执行main方法的时候,同步去等待performOperation方法执行结束,结束时再去执行callback里面的逻辑。

相对的,开启子线程,我们将回调函数作为方法参数,并将这个方法交给子线程,那么主线程直接接着往下走(同时子线程去完成耗时长的performOperation方法),先打印异步,接着输出结果8

标签:异步,函数,文件,编程,网络,callback,描述符,result,IO
From: https://blog.csdn.net/weixin_64842400/article/details/143256489

相关文章

  • EBIS4043 Big Data Analysis and Applications
    ThepurposeofthisassignmentistomakesurethatyouarepickinguptheRbasedanalyticsskills(Pleasedonotuseothertoolstogeneratetheanswers!)thathavebeenintroducedinthisclassandcheckyourability.(Total50marks)1.Usethedataset......
  • React--》掌握Valtio让状态管理变得轻松优雅
    Valtio采用了代理模式,使状态管理变得更加直观和易于使用,同时能够与React等框架无缝集成,本文将深入探讨Valtio的核心概念、使用场景以及其在提升应用性能中的重要作用,帮助你掌握这一强大工具,从而提升开发效率和用户体验。目录初识ValtioValtio基础使用代理与快照订阅与侦......
  • 使用spi-gpio-custom模块配置SPI总线
    使用spi-gpio-custom模块配置SPI总线 来源https://www.xuzhe.tj.cn/index.php/2023/10/26/spi-gpio-customspi/参考专栏 https://www.zhihu.com/column/c_1698084667767709696 1.引言SPI(SerialPeripheralInterface)是一种常见的串行通信协议,广泛应用于微控制器与外部......
  • 基于神经网络应用于手写数字识别-matlab
    运用matlab编程进行神经网络进行手写数字识别。实验过程:一、BP神经网络神经网络是由很多神经元组成,可以分为输入,输出,隐含层。BP神经网络的特点:信号前向传递,信号反向传播。若输出存在误差,根据误差调整权值和阈值,使网络的输出接近预期。在用BP神经网络进行预测之前要训练网......
  • 2024CS 525 All SectionsProgramming
    AdvancedDatabaseOrganization-Fall2024CS525-AllSectionsProgrammingAssignmentIII:RecordManagerDue:Friday,October18th2024by23h59TaskThegoalofthisassignmentistoimplementasimplerecordmanager.Therecordmanagerhandlestablesw......
  • HTML(网页)打包EXE, 添加网络验证(卡密)详解
    介绍HTML(网页)打包EXE软件1.9.97版本中,新增了网络验证功能,它可以给打包生成的EXE文件添加网络验证功能,即添加卡密,打包后的EXE文件用户首次打开使用时,会提示需要输入激活码(卡密),输入正确后才可以正常使用. CSDN文库下载地址: https://download.csdn.net/downl......
  • CF771A. Bear and Friendship Condition 题解 并查集
    题目链接:https://codeforces.com/problemset/problem/771/A视频讲解:https://www.bilibili.com/video/BV1tZ1FYPELp/?p=6题目大意:判断一个无向图中的每个连通块是否都是一个完全图。首先我们可以用并查集维护每个连通块的大小。其次,我们可以开一个\(cnt_i\)表示以节点\(i\)......
  • 嵌入式学习-网络-Day01
    嵌入式学习-网络-Day011.网络发展史1.1局域网(LAN)1.2广域网(Wan)1.3家庭用网1.3.1光猫1.3.2交换机与路由器:2.IP地址2.1基本概念2.2二级划分(ipv4)2.3特殊地址2.4子网掩码2.5三级划分域名系统域名结构3.网络模型3.1网络的体系结构3.2OSI模型3.3TCP/IP模型3.4......
  • 网络安全基础要点知识介绍
    文章目录网络安全网络安全问题概述两类密码体制数字签名鉴别报文鉴别实体鉴别密钥分配对称密钥的分配公钥的分配互联网使用的安全协议运输层安全协议参考文献网络安全网络安全问题概述计算机网络的通信面临两大类威胁:被动攻击和主动攻击。被动攻击:指攻击者从网络上......
  • minio 多节点部署
    先决条件firewalld配置firewall-cmd--permanent--zone=public--add-port=9000/tcpfirewall-cmd--reload节点说明cat>>/etc/hosts<<EOF192.168.174.100minio-01192.168.174.101minio-02EOF挂载点mkdir-pv/data/disk1/miniomkdir-pv/data/disk2/mini......