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

IO多路转接

文章目录

  • 五种IO模型
  • fcntl
  • 多路转接
    • select
    • poll
    • epoll
      • epoll的工作模式

五种IO模型

  1. 阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式.阻塞IO是最常见的IO模型。
  2. 非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULDBLOCK错误码。非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符, 这个过程称为轮询. 这对CPU来说是较大的浪费, 一般只有特定场景下才使用.
  3. 信号驱动IO: 内核将数据准备好的时候, 使用SIGIO信号通知应用程序进行IO操作。
  4. O多路转接:和阻塞IO类似. 最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态.
  5. 异步IO: 由内核在数据拷贝完成时, 通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)。

任何IO过程中, 都包含两个步骤. 第一是等待, 第二是拷贝. 而且在实际的应用场景中, 等待消耗的时间往往都远远高于拷贝的时间. 让IO更高效, 最核心的办法就是让等待的时间尽量少。

同步通信VS异步通信
所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回. 但是一旦调用返回,就得到返回值了; 换句话说,就是由调用者主动等待这个调用的结果;异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果; 换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果; 而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

fcntl

函数原型
在这里插入图片描述

传入的cmd的值不同, 后面追加的参数也不相同
fcntl函数有5种功能:

  1. 复制一个现有的描述符(cmd=F_DUPFD)
  2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD).
  3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL).
  4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)
  5. 获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW)。

由于IO大多数都是阻塞的,但是我们要设置非阻塞只是用第三种功能, 获取/设置文件状态标记, 就可以将一个文件描述符设置为非阻塞.

下面是一个可以将文件描述符设置为非阻塞的函数。

void SetNoBlock(int fd) 
{int fl = fcntl(fd, F_GETFL);if (fl < 0) {perror("fcntl");return;}fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}

多路转接

select

select系统调用是用来让我们的程序监视多个文件描述符的状态变化的;程序会停在select这里等待,直到被监视的文件描述符有一个或多个发生了状态改变。在这里插入图片描述
参数nfds是需要监视的最大的文件描述符值+1

中间的fd_set* 参数是一个输入输出型参数,表示我们要select给我们监视的文件描述符的集合,一旦有文件就绪,也会通过这个参数给我们传递哪个文件描述符就绪了。

参数timeout为结构timeval,用来设置select()的等待时间。
在这里插入图片描述
NULL:则表示select()没有timeout,select将一直被阻塞,直到某个文件描述符上发生了事件。
0:仅检测描述符集合的状态,然后立即返回,并不等待外部事件的发生,也就是非阻塞
特定的时间值:如果在指定的时间段里没有事件发生,select将超时返回。

fd_set是一个位图结构,比特位的位置表示那个fd,比特位的数值表示是否需要关心这个fd,或者这个fd是否就绪了。OS为我们提供了一些对位图进行的操作函数。
在这里插入图片描述

函数返回值:
执行成功则返回文件描述词状态已改变的个数。
如果返回0代表在描述词状态改变前已超过timeout时间,没有返回。
当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds, exceptfds和timeout的值变成不可预测。

select的缺点
可监控的文件描述符个数取决与sizeof(fd_set)的值.
将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd。
每次调用select, 都需要手动设置fd集合, 从接口使用角度来说也非常不便。
每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大。
同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大。

poll

poll解决了select上限的问题,并且把输入和输出参数进行分离,不需要每一次都对参数进行重置。

在这里插入图片描述
pollfd结构中存在一个fd文件描述符,events表示我们需要OS帮我们关心的事件,revents表示每次响应是这个fd上的哪些事件就绪了。timeout表示poll函数的超时时间, 单位是毫秒(ms).fds是一个poll函数监听的结构列表,需要我们自己维护,传给系统,nfds表示这个数组的长度。

events和revents的取值:
在这里插入图片描述
返回值的含义和select是一样的。

poll的优点:

  1. 可以等待多个文件描述符,效率高。
  2. 输入输出分离,不需要频繁的对poll参数进行重置了。
  3. poll关心的fd没有上限。

poll的缺点:

  1. 用户到内核是要有数据拷贝的
  2. poll在内核和应用层都是需要遍历看fd是否关心或者是否就绪的,影响效率。

epoll

epoll的原理:
在使用epoll时,我们需要现在内核中创建一个epoll模型,这个模型中存在一颗红黑树,这颗红黑树维护了我们需要关心的文件描述符的各种时间,所以系统给我们提供了对红黑树增删改的接口,poll和select在内核中都是需要遍历来确定fd是否就绪的,因为他们要检测的是struct file,但是epoll不一样,当有数据需要发送或者到来时,硬件会发生硬件中断,此时硬件会提醒epoll,我们在创建epoll后,在红黑树中添加或者修改fd,会在内核和硬件中间驱动层,为每个fd都设置对应的回调方法,所以当硬件就绪时,就会执行这个回调方法,在epoll模型中还存在一个就绪队列,这个回调方法就会把红黑树对应fd的事件同时链入到就绪队列,当上层意识有fd就绪时,直接就去就绪队列中取就可以了。因此,凡是在就绪队列中的节点,一定是就绪的,一定是用户关心的。这些操作都是OS完成的,我们不需要关心。

在这里插入图片描述
接下来介绍一下接口:

  1. epoll_create
    在这里插入图片描述
    自从linux2.6.8之后,size参数是被忽略的,它的作用是帮助我们创建一个epoll模型,包括红黑树和就绪队列,然后创建好epoll模型之后为我们返回一个fd标识这个epoll模型,因为OS中可能会存在很多的epoll模型,它就一定要这么多的epoll模型进行管理,而我们用户层主要就是创建好之后通过返回的fd进行访问对应的epoll模型的。

  2. epoll_ctl
    在这里插入图片描述
    epoll的事件注册函数,主要是对底层的红黑树进行操作,第一个参数是epoll_create()的返回值,第二个参数表示动作,用三个宏来表示,第三个参数是需要监听的fd,第四个参数是告诉内核需要监听什么事件。
    第二个参数的取值:
    EPOLL_CTL_ADD :注册新的fd到epfd中。
    EPOLL_CTL_MOD :修改已经注册的fd的监听事件。
    EPOLL_CTL_DEL :从epfd中删除一个fd。
    分别对应的也就是对红黑树数据结构的增改删。
    struct epoll_event结构:
    在这里插入图片描述
    events就表示要监听的事件,可以是以下几个宏的集合
    在这里插入图片描述
    data中的fd一般是设置给我们自己看的,在内核给我们返回好的事件的时候,我们可以通过这个参数知道哪个fd就绪了。

  3. epoll_wait
    在这里插入图片描述
    第一个参数依然是我们创建的epoll模型对应的,表示要在那个epoll模型上等,epoll将会把发生的事件赋值到events数组中 (events不可以是空指针,内核只负责把数据复制到这个events数组中,不会去帮助我们在用户态中分配内存),maxevents告之内核这个events有多大,这个 maxevents的值不能大于创建epoll_create()时的size,timeout和返回值和poll和select是一模一样的。我们不需要担心就绪队列太多,但是我们给的数组太少怎么办,epoll会把我们数组先给满,然后我们进行处理完后,epoll再次等待是会立刻返回接着给我们响应。队列对保留已经发生的事件,方便我们下一次读取。
    epoll_wait检测事件就绪的时间复杂度是O(1)的,因为只需要判断就绪队列是否为空就可以了,获取所有事件的时间复杂度是O(N)的,这个是无法避免的,并且epoll可以保证数组的每一次遍历都是有效遍历,和select和poll不一样,他们还需要判断自己维护的所有fd是否就绪了,而epoll拿到的就一定是就绪的。没有多余的遍历动作。

总结一下, epoll的使用过程就是三部曲:
调用epoll_create创建一个epoll模型;
调用epoll_ctl, 将要监控的文件描述符进行注册;
调用epoll_wait, 等待文件描述符就绪;

优点:
接口使用方便: 虽然拆分成了三个函数, 但是反而使用起来更方便高效. 不需要每次循环都设置关注的文件描述符, 也做到了输入输出参数分离开。
数据拷贝轻量: 只在合适的时候调用 EPOLL_CTL_ADD 将文件描述符结构拷贝到内核中, 这个操作并不频繁(而select/poll都是每次循环都要进行拷贝).
事件回调机制: 避免使用遍历, 而是使用回调函数的方式, 将就绪的文件描述符结构加入到就绪队列中,epoll_wait 返回直接访问就绪队列就知道哪些文件描述符就绪. 这个操作时间复杂度O(1). 即使文件描述符数目很多, 效率也不会受到影响.
同样没有文件描述符数量的限制。

epoll的工作模式

epoll有2种工作方式-水平触发(LT)和边缘触发(ET)

  1. 水平触发Level Triggered 工作模式
    当epoll检测到socket上事件就绪的时候, 可以不立刻进行处理. 或者只处理一部分,那么下一次wait时就要立刻返回,直到缓冲区上所有的数据都被处理完, epoll_wait 才不会立刻返回,所以LT模式下,阻塞读取和非阻塞读取都是没有问题的。

  2. 边缘触发Edge Triggered工作模式
    当epoll检测到socket上事件就绪时, 必须立刻处理,但是在ET模式下,如果上一次没有处理完,那么下一次在wait时就不会立即返回了,只有当再次有新的事件就绪时才会返回,那么下一次处理老的没处理完的数据,新的数据就要等下一次处理,正是这种机制,倒逼这我们程序员,如果时间就绪取数据的话,就要一次取完,因此就需要对对应的fd设置非阻塞读取,epoll_wait 返回的次数少了很多,有因为我们每次都把就绪的数据读完了,所以也就让tcp发送给对方的窗口大小变大了,从而从概率上提高了通信效率。所以ET策略是相对比较高效的。

select和poll其实也是工作在LT模式下. epoll既可以支持LT, 也可以支持ET.

在多路转接中,读事件大部分情况都是阻塞的,所以对于读事件一开始一般都直接关心,但是对于写事件,因为一开始发送缓冲区就是空的,就是可以直接写的,所以对于事件,一般都是直接发,直到发送缓冲区满了,发送条件不具备,才会把fd对应的写事件交给OS。

相关文章:

IO多路转接

文章目录 五种IO模型fcntl多路转接selectpollepollepoll的工作模式 五种IO模型 阻塞IO: 在内核将数据准备好之前, 系统调用会一直等待. 所有的套接字, 默认都是阻塞方式.阻塞IO是最常见的IO模型。非阻塞IO: 如果内核还未将数据准备好, 系统调用仍然会直接返回, 并且返回EWOULD…...

基于深度学习的面部表情分类识别系统

&#xff1a;温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 面部表情识别是计算机视觉领域的一个重要研究方向&#xff0c; 它在人机交互、心理健康评估、安全监控等领域具有广泛的应用。近年来&#xff0c;随着深度学习技术的快速发展&#xf…...

日志远程同步实验

目录 一.实验环境 二.实验配置 1.node1发送方配置 &#xff08;1&#xff09;node1写udp协议 &#xff08;2&#xff09;重启服务并清空日志 2.node2接收方配置 &#xff08;1&#xff09;node2打开接受日志的插件&#xff0c;指定插件用的端口 &#xff08;2&#xff…...

数据结构之《二叉树》(中)

在数据结构之《二叉树》(上)中学习了树的相关概念&#xff0c;还了解的树中的二叉树的顺序结构和链式结构&#xff0c;在本篇中我们将重点学习二叉树中的堆的相关概念与性质&#xff0c;同时试着实现堆中的相关方法&#xff0c;一起加油吧&#xff01; 1.实现顺序结构二叉树 在…...

php json_encode 参数 JSON_PRETTY_PRINT

https://andi.cn/page/621642.html...

【UE 网络】Gameplay框架在DS架构中的扮演的角色

目录 0 引言1 核心内容1.1 Gameplay各部分创建的流程1.2 Gameplay框架在DS和客户端的存在情况1.3 数据是独立存在于DS和客户端的 2 Gameplay框架各自负责的功能2.1 GameMode2.2 GameState2.3 PlayerController2.4 PlayerState2.5 Pawn2.6 AIController2.7 Actor2.8 HUD2.9 UI &…...

【云原生】StatefulSet控制器详解

StatefulSet 文章目录 StatefulSet一、介绍与特点1.1、介绍1.2、特点1.3、组成部分1.4、为什么需要无头服务1.5、为什么需要volumeClaimTemplate 二、教程2.1、创建StatefulSet2.2、查看部署资源 三、StatefulSet中的Pod3.1、检查Pod的顺序索引3.2、使用稳定的网络身份标识3.3、…...

使用 Python 制作一个属于自己的 AI 搜索引擎

1. 使用到技术 OpenAI KEYSerper KEYBing Search 2. 原理解析 使用Google和Bing的搜搜结果交由OpenAI处理并给出回答。 3. 代码实现 import requests from lxml import etree import os from openai import OpenAI# 从环境变量中加载 API 密钥 os.environ["OPENAI_AP…...

rust读取csv文件,匹配搜索字符

1.代码 use std::fs::File; use std::io::{BufRead, BufReader}; use regex::{Regex};fn main() {let f File::open("F:\\0-X-RUST\\1-systematic\\ch2-fileRead\\data\\test.csv").unwrap();let mut reader BufReader::new(f);let re Regex::new("45asd&qu…...

隐藏采购订单类型

文章目录 1 Introduction2 code 1 Introduction The passage is that how to hiden purchase type . 2 code DATA: ls_shlp_selopt TYPE ddshselopt. IF ( sy-tcode ME21N OR sy-tcode ME22N OR sy-tcode ME23N or sy-tcode ME51N OR sy-tcode ME52N OR sy-tcode ME5…...

ESP32人脸识别开发- 基础介绍(一)

一、ESP32人脸识别的方案介绍 目前ESP32和ESP32S3都是支持的&#xff0c;官方推的开发板有两种&#xff0c;一种 ESP-EYE ,没有LCD 另一种是ESP32S3-EYE,有带LCD屏 二、ESP32人脸识别选用ESP32的优势 ESP32S3带AI 加速功能&#xff0c;在人脸识别的速度是比ESP32快了不少 | S…...

编程学习指南:语言选择、资源推荐与高效学习策略

目录 一、编程语言选择 1. Java&#xff1a;广泛应用的基石 2. C/C&#xff1a;深入底层的钥匙 3. Python&#xff1a;AI与大数据的宠儿 4. Web前端技术&#xff1a;构建交互界面的艺术 二、学习资源推荐 1. 国内外在线课程平台 2. 官方文档与教程 3. 书籍与电子书 4…...

AWS开发人工智能:如何基于云进行开发人工智能AI

随着人工智能技术的飞速发展&#xff0c;企业对高效、易用的AI服务需求日益增长。Amazon Bedrock是AWS推出的一项创新服务&#xff0c;旨在为企业提供一个简单、安全的平台&#xff0c;以访问和集成先进的基础模型。本文中九河云将详细介绍Amazon Bedrock的功能特点以及其收费方…...

CentOS 8 的 YUM 源替换为国内的镜像源

CentOS 8 的 YUM 源替换为国内的镜像源 1.修改 DNS 为 114.114.114.1141.编辑 /etc/resolv.conf 文件&#xff1a;2.在文件中添加或修改如下内容&#xff1a;3.保存并退出编辑器。 2.修改 YUM 源为国内镜像1.备份原有的 YUM 源配置&#xff1a;2.下载新的 YUM 源配置3.清理缓存…...

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路&#xff0c;三分钟的热情可以放弃往下看了。2.多练多想&#xff0c;不要离开了教程什么都不会了&#xff0c;最好看完教程自己独立完成技术方面的开发。3.有时多百度&#xff0c;我们往往都遇不到好心的大神&#xff0c;谁会无聊天天给…...

浅学爬虫-爬虫维护与优化

在实际项目中&#xff0c;爬虫的稳定性和效率至关重要。通过错误处理与重试机制、定时任务以及性能优化&#xff0c;可以确保爬虫的高效稳定运行。下面我们详细介绍这些方面的技巧和方法。 错误处理与重试机制 在爬虫运行过程中&#xff0c;网络不稳定、目标网站变化等因素可…...

STM32G070系列芯片擦除、写入Flash错误解决

在用G070KBT6芯片调用HAL_FLASHEx_Erase(&EraseInitStruct, &PageError)时&#xff0c;调试发现该函数返回HAL_ERROR&#xff0c;最后定位到FLASH_WaitForLastOperation(FLASH_TIMEOUT_VALUE)函数出现错误&#xff0c;pFlash.ErrorCode为0xA0&#xff0c;即FLASH错误标…...

08.02_111期_Linux_NAT技术

NAT(network address translation)技术说明 IP报文在转发的时候需要考虑 源IP地址 和 目的IP地址&#xff0c; IP报文每到达一个节点&#xff0c;就会更改一次IP地址和目的IP地址&#xff0c;其中节点是指主机、服务器、路由器 那么这个更改是如何进行的呢&#xff1f; 除了…...

【2024蓝桥杯/C++/B组/小球反弹】

题目 分析 Sx 2 * k1 * x; Sy 2 * k2 * y; &#xff08;其中k1, k2为整数&#xff09; Vx * t Sx; Vy * t Sy; k1 / k2 (15 * y) / (17 * x)&#xff1b; 目标1&#xff1a;根据k1与k2的关系&#xff0c;找出一组最小整数组&#xff08;k1, k2&#xff09;&#xff…...

PHP中如何实现函数的可变参数列表

在PHP中&#xff0c;实现函数的可变参数列表主要有两种方式&#xff1a;使用func_get_args()函数和使用可变数量的参数&#xff08;通过...操作符&#xff0c;自PHP 5.6.0起引入&#xff09;。 1. 使用func_get_args()函数 func_get_args()函数用于获取传递给函数的参数列表&…...

串---链串实现

链串详解 本文档将详细介绍链串的基本概念、实现原理及其在 C 语言中的具体应用。通过本指南&#xff0c;读者将了解如何使用链串进行各种字符串操作。 1. 什么是链串&#xff1f; 链串是一种用于存储字符串的数据结构&#xff0c;它使用一组动态分配的节点来保存字符串中的…...

科技赋能生活——便携气象站

传统气象站往往庞大而复杂&#xff0c;需要专业人员维护&#xff0c;它小巧玲珑&#xff0c;设计精致&#xff0c;可以轻松放入背包或口袋&#xff0c;随身携带&#xff0c;不占空间。无论是城市白领穿梭于高楼大厦间&#xff0c;还是户外爱好者深入山林湖海&#xff0c;都能随…...

Golang——GC原理

1.垃圾回收的目的 将未被引用到的对象销毁&#xff0c;回收其所占的内存空间。 2.根对象是什么 全局变量&#xff1a;在编译器就能确定的存在于程序整个生命周期的变量。 执行栈&#xff1a;每个goroutine都包含自己的执行栈&#xff0c;这些执行栈上包含栈上的变量及指向分配…...

OpenStack概述

一、初识OpenStack OpenStack Docs: 概况 一&#xff09;OpenStack架构简述 1、理解OpenStack OpenStack既是一个社区&#xff0c;也是一个项目和一个开源软件&#xff0c;提供开放源码软件&#xff0c;建立公共和私有云&#xff0c;它提供了一个部署云的操作平台或工具集&…...

机器学习练手(三):基于决策树的iris 多分类和波士顿房价预测

总结&#xff1a;本文为和鲸python 可视化探索训练营资料整理而来&#xff0c;加入了自己的理解&#xff08;by GPT4o&#xff09; 原活动链接 原作者&#xff1a;vgbhfive&#xff0c;多年风控引擎研发及金融模型开发经验&#xff0c;现任某公司风控研发工程师&#xff0c;对…...

PS 2024 百种常用插件下载安装教程【免费使用,先到先得】

文章目录 软件介绍软件下载安装步骤 专栏推荐&#xff1a; 超多精品软件&#xff08;持续更新中…&#xff09; 软件推荐&#xff1a; PS 2024 PR 2024 软件介绍 PS常用插件 此软件整合了市面近百款ps处理插件&#xff0c;可实现&#xff1a;一键制作背景&#xff0c;一键抠图…...

逻辑推理之lora微调

逻辑推理微调 比赛介绍准备内容lora微调lora微调介绍lora优势代码内容 start_vllm相关介绍调用 运行主函数提交结果总结相应连接 比赛介绍 本比赛旨在测试参与者的逻辑推理和问题解决能力。参与者将面对一系列复杂的逻辑谜题&#xff0c;涵盖多个领域的推理挑战。 比赛的连接:…...

前端-防抖代码

//防抖debounce(fn, time 1000) {let timer null;return function (...args) {if (timer) clearTimeout(timer);timer setTimeout(() > {fn.apply(this, args);}, time);};},// 输入变化处理函数async inputChange(value) {if (!this.debouncedInputChange) {this.deboun…...

langchain 入门指南 - 让 LLM 自动选择不同的 Prompt

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 让 LLM 自动选择不同的 Prompt 在上一篇文章中&#xff0c;我们学会了如何让 langchain 来自动选择不同的 LLM Chain&#xff0c;以便回…...

web浏览器播放rtsp视频流,海康监控API

概述 这里记录一下如何让前端播放rtsp协议的视频流 ​ 项目中调用海康API&#xff0c;生成的视频流(hls、ws、rtmp等)通过PotPlayer播放器都无法播放&#xff0c;说明视频流有问题&#xff0c;唯独rtsp视频流可以播放。 但是浏览器本身是无法播放rtsp视频的&#xff0c;即使…...

石龙做网站/中央电视台新闻联播广告价格

1.创建一个helloworld主程序类 /** * SpringBootApplication 用来标注一个主程序类&#xff0c;这是一个SpringBoot应用 */SpringBootApplicationpublic class SpringBootHellowordConfigApplication { public static void main(String[] args) { //Spring应用启动 …...

个人空间网站免费/找网站公司制作网站

23:过滤多余的空格 总时间限制: 1000ms内存限制:65536kB描述一个句子中也许有多个连续空格&#xff0c;过滤掉多余的空格&#xff0c;只留下一个空格。 输入一行&#xff0c;一个字符串&#xff08;长度不超过200&#xff09;&#xff0c;句子的头和尾都没有空格。输出过滤之后…...

广东网站建设专业公司/网络营销方式对比分析

电脑现在已成为人们学习、工作、娱乐必备的工具之一&#xff0c;掌握一些电脑技巧不仅可以丰富我们的技能&#xff0c;更能提高我们的效率&#xff01;今天给小伙伴们分享18个可以说是基本但又非常实用的电脑技巧&#xff0c;如果这些你没都掌握&#xff0c;可能你还处于小白阶…...

网站备案信息变更/网页优化包括

一.体验Stream流 Stream流通常和Lambda结合使用 1.原本的方式 2.Stream流来改进 二.Stream流的常见生成方式 Collection体系的集合就是list set queue 三.Stream流中间操作 注意这几个方法中的参数好多要求的是函数式接口&#xff0c;这些函数式接口直接使用的Lambda方式实现…...

在台湾做色聊的网站犯法不/编程培训机构

一、定义set是一个无序且不重复的元素集合。集合对象是一组无序排列的可哈希的值&#xff0c;集合成员可以做字典中的键。集合支持用in和not in操作符检查成员&#xff0c;由len()内建函数得到集合的基数(大小)&#xff0c; 用 for 循环迭代集合的成员。但是因为集合本身是无序…...

如何把网站做的好看/淘宝大数据查询平台

简介 它使用户可以改变一个request和修改一个response. Filter 不是一个servlet&#xff0c;它不能产生一个response&#xff0c;它能够在一个request到达servlet之前预处理request&#xff0c;也可以在response离开servlet时处理response.换种说法&#xff0c;filter其实是一个…...