深入解析异步编程:Java NIO、Python `async/await` 与 C# `async/await` 的对比
在现代编程中,异步编程已成为处理 I/O 密集型任务(如网络请求、文件操作等)的高效方式。不同的编程语言提供了各自的异步编程模型,以提高程序的性能和资源利用率。本文将深入解析 Java 的 NIO、Python 的 async/await
和 C# 的 async/await
,对比它们的实现原理、编程模型和应用场景,帮助你更好地理解和选择适合的异步编程技术。
一、Java 的 NIO
(一)核心组件
Java 的 NIO(New Input/Output)是 Java 1.4 引入的一组 API,用于提供非阻塞的、高速的 I/O 功能。NIO 的核心组件包括:
-
通道(Channels):
- 通道是对原生 I/O 操作系统功能的直接映射,可以理解为一种新的 I/O 流。常见的通道包括
FileChannel
、DatagramChannel
和SocketChannel
。 - 通道可以是非阻塞的,这意味着它们可以在没有数据可读或没有空间可写时立即返回。
- 通道是对原生 I/O 操作系统功能的直接映射,可以理解为一种新的 I/O 流。常见的通道包括
-
缓冲区(Buffers):
- 缓冲区是 NIO 的另一个核心概念,用于存储 I/O 操作的数据。常见的缓冲区类型包括
ByteBuffer
、CharBuffer
和IntBuffer
。 - 缓冲区是线程安全的,可以被多个线程共享。
- 缓冲区是 NIO 的另一个核心概念,用于存储 I/O 操作的数据。常见的缓冲区类型包括
-
选择器(Selectors):
- 选择器用于监听多个通道的 I/O 事件(如连接打开、数据到达等)。通过选择器,一个线程可以管理多个通道,从而实现高效的 I/O 多路复用。
(二)工作原理
Java 的 NIO 通过非阻塞通道和选择器实现高效的 I/O 操作。以下是其工作原理的简要描述:
-
创建通道:
- 打开一个通道(如
ServerSocketChannel
),并将其设置为非阻塞模式。 - 将通道注册到选择器上,指定感兴趣的 I/O 事件(如
SelectionKey.OP_ACCEPT
或SelectionKey.OP_READ
)。
- 打开一个通道(如
-
选择器轮询:
- 选择器通过
select
方法轮询注册的通道,检查是否有感兴趣的 I/O 事件发生。 - 当有事件发生时,选择器返回一组
SelectionKey
,表示哪些通道已经准备好进行相应的 I/O 操作。
- 选择器通过
-
处理事件:
- 遍历返回的
SelectionKey
集合,根据事件类型(如接受新连接、读取数据)进行相应的处理。 - 处理完成后,继续轮询选择器,等待下一个事件。
- 遍历返回的
(三)示例代码
import java.nio.channels.*;
import java.nio.ByteBuffer;
import java.io.IOException;public class NIOServer {public static void main(String[] args) throws IOException {Selector selector = Selector.open();ServerSocketChannel serverSocket = ServerSocketChannel.open();serverSocket.bind(new InetSocketAddress(8080));serverSocket.configureBlocking(false);serverSocket.register(selector, SelectionKey.OP_ACCEPT);while (true) {selector.select();Set<SelectionKey> selectedKeys = selector.selectedKeys();Iterator<SelectionKey> iter = selectedKeys.iterator();while (iter.hasNext()) {SelectionKey key = iter.next();iter.remove();if (key.isAcceptable()) {// 接受新的连接SocketChannel clientSocket = serverSocket.accept();clientSocket.configureBlocking(false);clientSocket.register(selector, SelectionKey.OP_READ);} else if (key.isReadable()) {// 读取数据SocketChannel clientSocket = (SocketChannel) key.channel();ByteBuffer buffer = ByteBuffer.allocate(1024);int bytesRead = clientSocket.read(buffer);if (bytesRead == -1) {clientSocket.close();} else {buffer.flip();System.out.println(new String(buffer.array(), 0, bytesRead));}}}}}
}
二、Python 的 async/await
(一)核心组件
Python 的 async/await
是基于事件循环的异步编程模型,用于处理 I/O 密集型任务。其核心组件包括:
-
协程(Coroutines):
- 协程是异步编程的基本单位,通过
async def
定义。协程可以在执行过程中暂停和恢复。 - 协程的执行由事件循环管理。
- 协程是异步编程的基本单位,通过
-
事件循环(Event Loop):
- 事件循环是异步编程的核心,负责调度和管理协程的执行。
- 事件循环会监听 I/O 事件,并在事件发生时通知相应的协程。
-
可等待对象(Awaitable Objects):
- 可等待对象是
await
的目标,如协程、asyncio.Future
或asyncio.Task
。 - 可等待对象提供了
__await__
方法,使得它们可以被await
调用。
- 可等待对象是
(二)工作原理
Python 的 async/await
通过事件循环和协程实现高效的 I/O 操作。以下是其工作原理的简要描述:
-
定义协程:
- 使用
async def
定义异步函数,返回一个协程对象。 - 协程对象可以通过
await
调用,暂停当前协程的执行,并将控制权交还给事件循环。
- 使用
-
事件循环调度:
- 事件循环通过
asyncio.run
启动,负责调度和管理协程的执行。 - 事件循环会监听 I/O 事件,并在事件发生时通知相应的协程。
- 事件循环通过
-
恢复协程执行:
- 当等待的 I/O 操作完成时,事件循环会将协程的状态从“等待”改为“就绪”,并将其重新加入任务队列。
- 事件循环会继续执行协程,从
await
的位置继续执行。
(三)示例代码
import asyncioasync def fetch_data(url):print(f"Fetching data from {url}")await asyncio.sleep(2) # 模拟异步操作print(f"Data fetched from {url}")return "Data"async def main():url = "https://example.com"data = await fetch_data(url)print(f"Received data: {data}")# 运行主函数
asyncio.run(main())
三、C# 的 async/await
(一)核心组件
C# 的 async/await
是基于任务(Task)的异步编程模型,用于处理 I/O 密集型任务。其核心组件包括:
-
任务(Task):
- 任务是异步操作的基本单位,表示一个异步操作的结果。
- 任务类似于 Python 的
Future
或asyncio.Task
,用于表示异步操作的状态和结果。
-
事件循环(Event Loop):
- C# 的异步编程依赖于 .NET 的任务调度器(Task Scheduler),它类似于 Python 的事件循环。
- 任务调度器负责调度和管理
Task
的执行。
-
状态机(State Machine):
- C# 的编译器会将
async
方法转换为一个状态机,负责管理异步操作的状态,并在适当的时候恢复执行。
- C# 的编译器会将
(二)工作原理
C# 的 async/await
通过任务调度器和状态机实现高效的 I/O 操作。以下是其工作原理的简要描述:
-
定义异步方法:
- 使用
async
关键字定义异步方法,返回类型通常是Task
或Task<T>
。 - 异步方法可以通过
await
调用,暂停当前方法的执行,并将控制权交还给调用者。
- 使用
-
任务调度器调度:
- 任务调度器负责管理
Task
的执行。 - 当一个
Task
完成时,任务调度器会触发相应的回调,恢复等待该Task
的方法的执行。
- 任务调度器负责管理
-
恢复方法执行:
- 当等待的 I/O 操作完成时,任务调度器会将方法的状态从“等待”改为“就绪”,并恢复方法的执行。
(三)示例代码
using System;
using System.Threading.Tasks;public class Program
{public static async Task Main(){string url = "https://example.com";string data = await FetchDataAsync(url);Console.WriteLine($"Received data: {data}");}public static async Task<string> FetchDataAsync(string url){Console.WriteLine($"Fetching data from {url}");await Task.Delay(2000); // 模拟异步操作Console.WriteLine($"Data fetched from {url}");return "Data";}
}
四、相似之处
-
非阻塞 I/O:
- Java 的 NIO、Python 的
async/await
和 C# 的async/await
都支持非阻塞 I/O 操作。在 Java 中,通道可以是非阻塞的;在 Python 中,协程通过await
暂停执行,等待 I/O 操作完成;在 C# 中,任务通过await
暂停执行,等待 I/O 操作完成。
- Java 的 NIO、Python 的
-
事件驱动:
- Java 的选择器、Python 的事件循环和 C# 的任务调度器都用于监听 I/O 事件,并在事件发生时触发相应的处理逻辑。这种事件驱动的机制使得程序可以高效地处理多个 I/O 操作。
-
多路复用:
- Java 的选择器、Python 的事件循环和 C# 的任务调度器都支持多路复用,即一个线程可以同时管理多个 I/O 操作。这大大提高了程序的性能和资源利用率。
五、差异
-
编程模型:
- Java NIO:基于通道和选择器的低级 API,需要手动管理通道和缓冲区。
- Python
async/await
:基于协程和事件循环的高级 API,提供了更简洁的语法和更易用的编程模型。 - C#
async/await
:基于任务和任务调度器的高级 API,提供了更强大的编译器支持,生成状态机来管理异步操作。
-
语言支持:
- Java NIO:是 Java 语言的一部分,需要显式地使用通道和选择器。
- Python
async/await
:是 Python 语言的内置特性,通过关键字async
和await
提供了更自然的语法支持。 - C#
async/await
:是 C# 语言的内置特性,编译器会生成状态机来管理异步操作。
-
线程模型:
- Java NIO:通常需要一个线程来管理选择器,但可以通过多线程来提高性能。
- Python
async/await
:事件循环通常运行在单个线程中,所有协程都在同一个线程中执行。 - C#
async/await
:默认情况下,异步方法可以在任何线程上恢复执行,但可以通过SynchronizationContext
控制。
六、总结
Java 的 NIO、Python 的 async/await
和 C# 的 async/await
都提供了非阻塞 I/O 的支持,通过事件驱动和多路复用提高了程序的性能和资源利用率。尽管它们在编程模型和语言支持上有差异,但它们的核心思想是相似的。Java 的 NIO 更适合需要高性能和细粒度控制的场景,而 Python 的 async/await
和 C# 的 async/await
提供了更简洁和易用的编程模型,适合快速开发和维护。
相关文章:
深入解析异步编程:Java NIO、Python `async/await` 与 C# `async/await` 的对比
在现代编程中,异步编程已成为处理 I/O 密集型任务(如网络请求、文件操作等)的高效方式。不同的编程语言提供了各自的异步编程模型,以提高程序的性能和资源利用率。本文将深入解析 Java 的 NIO、Python 的 async/await 和 C# 的 as…...
阿里云数据盘级别
数据盘PL0、PL1、PL2和PL3的区别体现在性能、容量范围以及应用场景等方面。具体分析如下: 性能 PL0:单盘最大IOPS为10,000,最大吞吐量为180MB/s。适用于中小型MySQL和SQLServer等数据库场景,中小规模ELK日志集群,SAP和…...
使用 Spring AI Alibaba 集成阿里云百炼大模型应用
随着人工智能技术的飞速发展,大模型在各个领域的应用越来越广泛。阿里云百炼大模型提供了强大的语言理解和生成能力,但如何将其高效地集成到实际应用中,一直是开发者关注的焦点。本文将详细介绍如何使用 Spring AI Alibaba 集成阿里云百炼大模…...
阿里云合集(不定期更新)
一、阿里云申请免费域名证书流程:https://blog.csdn.net/humors221/article/details/143266059 二、阿里云发送国内短信怎样编程:https://blog.csdn.net/humors221/article/details/139544193 三、阿里云ECS服务器磁盘空间不足的几个文件:h…...
零基础设计模式——创建型模式 - 抽象工厂模式
第二部分:创建型模式 - 抽象工厂模式 (Abstract Factory Pattern) 我们已经学习了单例模式(保证唯一实例)和工厂方法模式(延迟创建到子类)。现在,我们来探讨创建型模式中更为复杂和强大的一个——抽象工厂…...
ConcurrentHashMap导致的死锁事故
事故现象 某线上服务共100台容器,第二天上午流量高峰期部分容器(约10%)cpu飙升,升至100%。 部分堆栈信息 堆栈信息如下如所示: 当前线程堆栈显示在JsonContext.get方法中调用computeIfAbsent,其Lambda表…...
Python高效网络爬虫开发指南
Python 网络爬虫入门与实战 一、引言 随着互联网数据的爆炸性增长,获取和分析这些数据变得越来越重要。网络爬虫作为数据采集的重要工具,在这其中扮演了不可或缺的角色。 二、环境搭建 首先我们需要安装Python环境以及一些必要的库: req…...
关于C++使用位运算交换变量值的分析
1、使用临时变量交换 交换变量的值,最常见的方法就是用临时变量。 void swap1(int& a, int& b){int c a;a b;b c; }清晰明了。 2、位运算版 对于整数类型,相信很多人都见过下面方法,可以使用位运算,从而不借用临时…...
06 接口自动化-框架封装思想建立之httprunner框架(下)
文章目录 一、httprunner如何实现数据驱动第一种:直接在脚本里面指定参数列表,最简单。适合于参数比较少的情况。第二种:使用CSV文件,适合于参数比较大的情况。第三种方式:使用函数生成数据,适用于数据变化…...
Dirsearch 深度使用教程:从基础扫描到携带 Cookie 探索网站
在网络安全测试和网站信息收集过程中,Dirsearch 是一款强大的开源工具,能够快速扫描网站,找出潜在的目录和文件。而当面对需要登录才能访问的网站资源时,通过携带 Cookie 扫描,Dirsearch 可以模拟已登录状态࿰…...
垃圾回收(GC)基础原理全面解析
掌握 GC 原理,是高效 Java 开发的第一步! 前言 垃圾回收(Garbage Collection,简称 GC)是 Java 的核心优势之一,它让开发者无需手动管理内存,极大降低了内存泄露和悬挂指针的风险。但当应用进入高并发、大数据量的场景时,GC 机制本身反而会成为性能瓶颈。 理解 GC 的原…...
海康NVR录像回放SDK原始流转FLV视频流:基于Java的流媒体转码(无需安装第三方插件ffmpeg)
wlinker-video-monitor 代码地址:https://gitee.com/wlinker/wlinker-video-monitor 背景与需求 在安防监控、智能楼宇等场景中,海康威视设备作为行业主流硬件,常需要将录像回放功能集成到Web系统中。然而,海康设备的原始视频流…...
【项目】SpringBoot +MybatisPlus集成多数据源
引言 应项目需求,需要引入另外的Mysql数据库,但是项目已经引入一个Mysql,这时有几种方案 通过Dynamic-DataSource 框架,无缝集成 但是是动态切换数据源的,跟项目需求不符合,于是采取第二种通过自定义数据…...
Suricata 3规则介绍、以及使用
列出更新源列表(有好多个规则源,后面有介绍的) suricata-update list-sourcesName: sslbl/ja3-fingerprintsVendor: Abuse.chSummary: Abuse.ch Suricata JA3 Fingerprint RulesetLicense: CC0-1.0 Name: malsilo/win-malwareVendor: malsil…...
基于OpenCV的物体跟踪:CSRT算法
文章目录 引言一、系统概述二、CSRT算法简介三、核心代码解析1. 初始化跟踪器和摄像头2. 主循环结构3. 目标选择与跟踪初始化4. 目标跟踪与结果显示5. 资源释放 四、系统使用说明五、完整代码六、总结 引言 目标跟踪是计算机视觉领域的重要应用之一,广泛应用于视频…...
面向未来,遨游推出5G-A智能防爆对讲机等系列终端
从5G扬帆到5G-A启航,遨游通讯始终立于技术潮头。在通信技术加速向5G-A演进的关键节点,遨游通讯旗舰产品AORO M6 Pro智能防爆对讲机,不仅实现了芯片到系统架构的全面自主可控,更通过5G-A技术的高速率、低时延、广连接与通感一体能力…...
qt浏览文件支持惯性
#include <QApplication> #include <QListWidget> #include <QScroller> #include <QScrollerProperties>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建列表控件并添加示例项QListWidget listWidget;for (int i 0; i <…...
算子窗口操作
抠图 (提取图像感兴趣的区域) * 使用halcon 抠图* 窗体属性设设置: 设置窗体绘制图案的模式 magrin边框模式(只有一个边框) * fill填充模式(边框内部会有一个遮罩层) dev_set_draw (fill)* 设置颜色 dev_set_color (green) * 设置线宽dev_set_line_width (5)read_image (Im…...
如何提灯验车
✅ 重点 车标倾斜特别严重 导航定位不准 发动机顿挫异响 自动门把手关闭时异响 底盘有划痕和主驾位与扶手箱位置间隙过小磨损 蓝牙钥匙解锁异常,开关解锁不灵敏 空调无法制冷 灯罩有划痕 开启大灯就有嗡嗡嗡的异响 ✅ 一、文件与证件检…...
人工智能在生物医学研究中的创新应用
随着人工智能(AI)技术的飞速发展,其在生物医学领域的应用逐渐成为研究热点。AI不仅为生物医学研究提供了强大的工具,还在疾病诊断、药物研发、基因编辑等方面展现出巨大的潜力。本文将探讨人工智能在生物医学研究中的创新应用&…...
迁移学习实战:用预训练模型解决小样本图像分类
🚀 迁移学习实战:用预训练模型解决小样本图像分类(PyTorch实现) 当我们没有成千上万的训练样本时,如何训练一个表现良好的图像分类模型?答案是——迁移学习。本篇将带你用 PyTorch 快速上手迁移学习,用预训练模型(如 ResNet18)解决小样本分类问题。 🧠 一、什么是迁…...
html,js获取扫码设备的输入内容
<script type"text/javascript"><!-- window.onload function () {// 获取扫描的二维码内容 var code ""; var lastTime, nextTime; var lastCode, nextCode; document.onkeypress function (e) { nextCode e.which; ne…...
项目执行中缺乏风险管理,如何预防潜在问题?
要预防潜在问题,必须在项目执行中融入建立全面的风险识别机制、制定应对策略、实施动态监控、强化团队风险意识、定期评估与复盘。其中,建立全面的风险识别机制至关重要。项目初期若未进行系统性的风险识别,就很难在项目过程中及时应对变化&a…...
树形展示三级分类数据
vue3 实现多级分类_产品设计 平台端添加多个二级三级分类的页面-CSDN博客...
大模型如何助力数学可视化?
大家好,我是 i 学习的老章 在数学学习和教学中,将抽象概念可视化对于理解至关重要。Manim 是一个强大的数学动画引擎,由著名数学科普视频作者 3Blue1Brown 开发并广为人知。 老章较早之前就介绍过 manim:B 站上爆红的数学视频&a…...
什么是endpoints?
在 Kubernetes 中,Endpoints 是一个资源对象,它表示服务(Service)到 Pod 的网络连接。 Endpoints 的主要作用是将服务的虚拟 IP 地址映射到实际的 Pod IP 地址,从而实现服务发现和负载均衡。 1.Endpoints 的作用 服务…...
基于 Redis 实现短信验证码登录功能的完整方案
🧱 一、技术栈与依赖配置 使用 Spring Boot Redis 实现短信验证码登录,以下是推荐的 Maven 依赖: <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><ar…...
监控易一体化运维:拥有全部核心技术,助力国产化信创运维
在数字化转型浪潮与信创产业蓬勃发展的当下,企业对运维系统的要求愈发严苛。随着数字化领域的巨大变迁,一款强大且适配信创环境的运维系统对企业的重要性不言而喻。今天,让我们一同深度剖析监控易系统在信创领域展现出的卓越优势。 信创产业&…...
微 PE , USM 魔术师两款 PE 对比
微 PE 和 USM 魔术师两款 PE 各有特点: 纯净度 微 PE:没有植入强制性、商业性软件和链接,也没有病毒和木马,非常纯净。USM 魔术师:同样无广告、无流氓、无捆绑、无后门,从官方途径下载能保证纯净度。 功能…...
测试模版1
本篇技术博文摘要 🌟 引言 📘 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。我是盛透侧视攻城狮,一名什么都会一丢丢的网络安全工程师,也是众多技术社区的活跃成员以及多家大厂官方认可人员&a…...
elementUI 中el-date-picker和el-select的样式调整
1. el-date-picker <el-date-picker class"select1" size"small" v-model"timeRangeArr" type"daterange" align"right" unlink-panels range-separator"至" start-placeholder"开始日期" end-pla…...
基于亚马逊云科技构建音视频直播审核方案
1. 前言 随着互联网内容形态的多样化发展,用户生成内容(UGC)呈现爆发式增长。社交平台、直播、短视频、语聊房等应用场景中,海量的音视频内容需要进行实时审核,以维护平台安全与用户体验。 然而,企业在构…...
Vue3 组件之间传值
在 Vue3 中,组件之间的数据传递主要有以下几种方式,适用于不同的场景: 一、父组件向子组件传值:props 1. 子组件定义 props <!-- ChildComponent.vue --> <script setup> // 组合式 API(推荐)…...
深入理解用于中断控制的 NVIC 寄存器
NVIC 中有多个用于中断控制的寄存器(异常类型 16~255),这些寄存器位于系统控制空间(SCS)地址区域。下表是这些寄存器的概览: 除了软件触发寄存器(STIR)外,所有这些寄存器…...
Podman(Pod Manager)简介
Podman 简介 Podman(Pod Manager)是一个开源的容器管理工具,由红帽(Red Hat)开发,用于替代 Docker,支持运行、管理 OCI(Open Container Initiative)容器和容器镜像。它设…...
HarmonyOS NEXT端云一体化工程目录结构
视频课程学习报名入口:HarmonyOS NEXT端云一体化开发 端云一体化开发工程由端开发工程(Application)和云开发工程(CloudProgram)两大核心模块构成。 1)端开发工程目录结构 端开发工程主要用于开发应用端侧的业务代码,通用云开发模板的端开发工程目录结构如下图所示: …...
【C++ 真题】P1075 [NOIP 2012 普及组] 质因数分解
P1075 [NOIP 2012 普及组] 质因数分解 题目描述 已知正整数 n n n 是两个不同的质数的乘积,试求出两者中较大的那个质数。 输入格式 输入一个正整数 n n n。 输出格式 输出一个正整数 p p p,即较大的那个质数。 输入输出样例 #1 输入 #1 21输…...
力扣热题100,力扣148.排序链表力扣.26找出字符串中第一个匹配项的下标力扣146.LRU缓存序列管理器
目录 力扣148.排序链表 力扣.26找出字符串中第一个匹配项的下标 力扣146.LRU缓存 序列管理器 力扣148.排序链表 那个O1,暂时我没有考虑,但是这个nlogn,我就想什么时候会有log呢,应该是2的次幂方向思考,一说2,是否能想到2分呢&…...
防火墙高可靠性
防火墙高可靠性技术概述 防火墙高可靠性技术分为两类:设备高可靠性和链路高可靠性 防火墙双机热备 双机热备概述及相关协议 HRP协议:即Huawei Redundancy Protocol,主要用于实现防火墙双机之间关键配置命令和状态化信息的备份,…...
C++ stack对象创建、入栈、获取栈顶
stack对象创建直接调用C对应的<stack>,进行创建 #include<iostream> #include<stack>using namespace std;int main() {// 1 默认构造函数stack<int> stk1;// 2 拷贝构造函数stack<int> stk2;stk1 stk2;return 0;} 入栈操作有一条…...
x-cmd install | Pillager:Go 语言打造的敏感信息文件系统扫描利器
目录 Pillager 的独特优势安装Pillager 的应用场景Pillager 的核心功能 还在为文件系统中潜在的敏感信息泄露而担忧吗?Pillager 是一款由 Go 语言编写的强大工具,旨在帮助你轻松扫描文件系统,发现隐藏的密钥、密码、API 令牌等敏感信息。 Pil…...
第9.1讲、Tiny Encoder Transformer:极简文本分类与注意力可视化实战
项目简介 本项目实现了一个极简版的 Transformer Encoder 文本分类器,并通过 Streamlit 提供了交互式可视化界面。用户可以输入任意文本,实时查看模型的分类结果及注意力权重热力图,直观理解 Transformer 的内部机制。项目采用 HuggingFace …...
asp.net web form nlog的安装
一、安装NuGet包 核心包安装 NLog提供日志记录核心功能 NLog.Config自动生成默认配置文件模板 配置NLog文件 配置文件创建 项目根目录自动生成NLog.config文件(通过NuGet安装NLog.Config时创建) <?xml version"1.0" encoding&…...
定时器的两种实现方式
1、基于优先级队列/堆 队列是先进先出,优先级队列是优先级越高就存放在队列之前,我们可以将过期时间越早设置为优先级越高,那么临近过期时间的任务就会在队列前面,距离过期时间越晚的任务就在队列后面。 可以分配一个线程&#…...
2025.05.21华为暑期实习机考真题解析第一题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 智能云任务分发系统 问题描述 卢小姐负责一家云计算公司的任务分发系统开发。该系统需要根据任务优先级和到达顺序进行智能调度,支持以下两种操作: 添加任务 add task_id pri…...
计算机网络-MPLS VPN报文转发
上一章学习了MPSL VPN的路由交互过程,VPN间学习到路由之后可以进行报文的转发了。 一、MPLS VPN报文转发过程 以图中用户X的站点B访问站点A的192.168.1.0/24网段为例,报文转发过程如下: 1.CE3上存在到192.168.1.0/24网段路由,发…...
关于sql 查询性能优化的小经验
最近接到一些sql优化的任务。数据库类型:DB2 有一个长sql查询效率低,大概要几十秒,大概查询逻辑如下: select * from tableA a where exists (select 1 from tableB b where a.idb.id ) or exists (select 1 from tableC c whe…...
Pandas:数据分析步骤、分组函数groupby和基础画图
本文目录: 一、概念(一)数据分析的基本步骤(二)两个属性:loc[行标签,列标签 ] 和 iloc[行索引位置,列索引位置 ]1.基本规则2.两属性的相同和不同对比 二、加载数据(一)按列加载数据&…...
游戏引擎学习第302天:使用精灵边界进行排序
在 game_render_group.cpp 中:正确计算 GetBoundFor() 里的 SpriteBound 值 我们正在进行游戏的排序问题调试。虽然这是一个二维游戏,但包含一些三维元素,因此排序变得比较复杂和棘手。混合二维和三维元素时,需要依赖一些比较主观…...
【完整版】基于laravel开发的开源交易所源码|BTC交易所/ETH交易所/交易所/交易平台/撮合交易引擎
功能说明 源码简介与安装环境说明: 开源交易所,基于laravel开发的交易所 | BTC交易所 | ETH交易所 | 交易所 | 交易平台 | 撮合交易引擎。本项目有完整的撮合交易引擎源码、后台管理(后端前端)、前台(交易页面、活动页…...