SUNFLOWER MATCH LAB Java八股文实践:深入理解多线程并发调用模型API

news2026/5/17 19:50:47
SUNFLOWER MATCH LAB Java八股文实践深入理解多线程并发调用模型API最近在和一些朋友交流Java面试准备时大家总绕不开“八股文”这个话题。线程池、Future、CompletableFuture这些词背起来容易但真要在高并发的实战场景里用明白又是另一回事了。正好我最近在折腾一个叫SUNFLOWER MATCH LAB的AI服务它的API调用就挺适合拿来练手。想象一下你有一个需求需要同时向这个AI服务发起上百个图片匹配或文本分析的请求并且要保证速度快、不崩掉、还能优雅地处理各种超时和错误。这不就是检验你Java并发“八股文”掌握程度的绝佳场景吗光知道ThreadPoolExecutor的七个参数可不够得知道怎么用它来管好你的API调用资源。所以这篇文章我就结合SUNFLOWER MATCH LAB的API调用带大家把Java并发里那些常考的知识点真正用代码“跑”起来。我们会从最基础的线程池配置开始一步步深入到异步编排和故障处理让你不仅会背更会用。1. 环境准备与场景设定在开始写代码之前我们得先把“战场”布置好。这里不需要复杂的Spring Boot项目一个干净的Maven工程就足够了。1.1 项目依赖与模拟客户端核心依赖其实就是用于发送HTTP请求的库。为了贴近实际我们使用HttpClient它是Java 11后自带的性能不错也支持异步。!-- 如果是Maven项目确保使用Java 11或以上 -- properties maven.compiler.source11/maven.compiler.source maven.compiler.target11/maven.compiler.target /properties我们首先模拟一个SUNFLOWER MATCH LAB的API客户端。为了专注于并发逻辑我们假设它的核心是一个耗时操作比如图片特征提取或复杂匹配。import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.net.URI; import java.time.Duration; import java.util.concurrent.CompletableFuture; /** * 模拟SUNFLOWER MATCH LAB API客户端 * 重点模拟一个耗时的网络IO操作 */ public class MockSunflowerLabClient { private final HttpClient httpClient; public MockSunflowerLabClient() { this.httpClient HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(5)) .build(); } /** * 模拟一次API调用包含网络延迟和可能的处理时间 * param taskId 任务ID用于日志跟踪 * return 模拟的API响应结果 * throws InterruptedException 模拟中断 */ public String callApiSync(String taskId) throws InterruptedException { // 模拟实际API调用耗时500ms - 1500ms int mockProcessingTime 500 (int)(Math.random() * 1000); Thread.sleep(mockProcessingTime); // 模拟一个很小的失败概率 if (Math.random() 0.05) { // 5%失败率 throw new RuntimeException(模拟API调用失败: taskId); } return String.format(任务[%s]完成耗时%dms结果: OK, taskId, mockProcessingTime); } /** * 异步版本的API调用更贴近真实HTTP请求 * param taskId 任务ID * return CompletableFuture包装的结果 */ public CompletableFutureString callApiAsync(String taskId) { // 模拟一个HTTP请求 HttpRequest request HttpRequest.newBuilder() .uri(URI.create(https://api.mock.sunflowerlab.com/match)) .timeout(Duration.ofSeconds(10)) .header(Content-Type, application/json) .POST(HttpRequest.BodyPublishers.ofString({\taskId\: \ taskId \})) .build(); return httpClient.sendAsync(request, HttpResponse.BodyHandlers.ofString()) .thenApply(response - { if (response.statusCode() 200 response.statusCode() 300) { return String.format(任务[%s]异步完成状态码: %d, taskId, response.statusCode()); } else { throw new RuntimeException(异步请求失败状态码: response.statusCode()); } }); } }这个模拟客户端有两个关键方法callApiSync模拟同步阻塞调用方便我们演示线程池处理阻塞任务callApiAsync则模拟真正的异步HTTP请求返回CompletableFuture。1.2 理解我们的并发挑战假设我们现在有100个图片需要提交给SUNFLOWER MATCH LAB进行处理。如果用一个for循环顺序调用总耗时将是每个任务耗时的总和可能达到几分钟这完全不可接受。我们的目标是快利用多线程同时发起多个请求大幅缩短总耗时。稳系统不能因为大量并发请求而崩溃内存溢出、线程耗尽。可控任务可能失败或超时我们需要有策略地处理而不是让整个流程挂掉。优雅任务完成后要能方便地获取所有结果进行后续处理。接下来我们就用Java并发工具箱里的家伙来逐一攻克这些挑战。2. 基石正确配置与使用线程池面试必问“说一下线程池的七大参数” 光背不行我们来看看在调用SUNFLOWER MATCH LAB API时它们怎么设置。2.1 核心参数实战解析直接上代码创建一个最适合我们这种IO密集型API调用的线程池。import java.util.concurrent.*; public class ThreadPoolDemo { public static void main(String[] args) { // 场景需要处理100个API调用任务 int taskCount 100; // 关键点1如何估算核心线程数 // 对于IO密集型任务如网络请求线程数可以设置多一些。 // 一个参考公式核心线程数 ≈ CPU核数 * (1 IO等待时间 / CPU计算时间) // 由于API调用大部分时间在等待网络响应我们可以设一个稍大的数比如CPU核数的2-4倍。 int corePoolSize Runtime.getRuntime().availableProcessors() * 2; // 关键点2最大线程数设多少 // 要考虑到下游服务SUNFLOWER MATCH LAB的承受能力。无脑开1000个线程可能把对方服务打挂。 // 这里我们假设对方服务并发能力较强设为核心线程数的2倍。 int maximumPoolSize corePoolSize * 2; // 关键点3空闲线程存活时间 // 如果任务量是波峰波谷的设置一个合理的存活时间比如60秒让多余的线程回收节省资源。 long keepAliveTime 60L; // 关键点4工作队列的选择与容量 // 使用有界队列 ArrayBlockingQueue防止任务无限堆积导致OOM。 // 容量需要权衡太小容易触发拒绝策略太大可能掩盖系统瓶颈。这里设为100。 BlockingQueueRunnable workQueue new ArrayBlockingQueue(100); // 关键点5线程工厂给线程起个好名字方便监控和排查问题 ThreadFactory threadFactory new ThreadFactory() { private final AtomicInteger threadNumber new AtomicInteger(1); Override public Thread newThread(Runnable r) { Thread t new Thread(r, SunflowerAPI-Worker- threadNumber.getAndIncrement()); t.setDaemon(false); return t; } }; // 关键点6拒绝策略 // CallerRunsPolicy让提交任务的线程如主线程自己执行被拒绝的任务。 // 这提供了一个简单的反馈机制让任务提交方感知到系统繁忙同时不会丢失任务。 RejectedExecutionHandler handler new ThreadPoolExecutor.CallerRunsPolicy(); // 创建线程池 ThreadPoolExecutor executor new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue, threadFactory, handler ); System.out.printf(线程池创建完毕: 核心%d, 最大%d, 队列容量%d%n, corePoolSize, maximumPoolSize, workQueue.remainingCapacity()); MockSunflowerLabClient client new MockSunflowerLabClient(); CountDownLatch latch new CountDownLatch(taskCount); // 用于等待所有任务完成 long startTime System.currentTimeMillis(); // 提交100个任务 for (int i 0; i taskCount; i) { final int taskId i; executor.submit(() - { try { String result client.callApiSync(Task- taskId); System.out.println(result); } catch (Exception e) { System.err.println(任务[ taskId ]执行异常: e.getMessage()); } finally { latch.countDown(); // 任务完成计数器减一 } }); } try { latch.await(); // 主线程等待所有任务完成 long totalTime System.currentTimeMillis() - startTime; System.out.printf(\n所有%d个任务执行完毕总耗时: %d ms%n, taskCount, totalTime); } catch (InterruptedException e) { e.printStackTrace(); } finally { // 关键点7优雅关闭线程池 executor.shutdown(); try { if (!executor.awaitTermination(60, TimeUnit.SECONDS)) { executor.shutdownNow(); } } catch (InterruptedException e) { executor.shutdownNow(); } } } }运行这段代码你会看到100个任务被快速执行完毕总耗时远小于顺序执行的累加时间。通过控制台打印的线程名你也能清晰地看到线程池的工作情况。2.2 为什么不用Executors快捷工厂面试里也常问“为什么不推荐用Executors.newFixedThreadPool” 上面的代码已经给出了答案。它默认使用无界的LinkedBlockingQueue任务可以无限堆积在突发大量任务时可能导致OOM。而我们自己构造ThreadPoolExecutor使用有界队列和明确的拒绝策略系统的行为更可控也更健壮。3. 进阶利用Future与CompletableFuture管理异步任务线程池解决了并发执行的问题但如何收集结果如何应对超时这就需要Future和它的增强版CompletableFuture出场了。3.1 使用Future获取结果与超时控制ExecutorService.submit()会返回一个Future对象。我们可以用它来查询任务状态、取消任务以及最关键的——获取结果或处理超时。import java.util.ArrayList; import java.util.List; import java.util.concurrent.*; public class FutureWithTimeoutDemo { public static void main(String[] args) { ThreadPoolExecutor executor new ThreadPoolExecutor( 4, 8, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(50), new ThreadPoolExecutor.CallerRunsPolicy() ); MockSunflowerLabClient client new MockSunflowerLabClient(); ListFutureString futureList new ArrayList(); int taskCount 10; // 提交任务并收集Future for (int i 0; i taskCount; i) { final int taskId i; FutureString future executor.submit(() - client.callApiSync(FutureTask- taskId)); futureList.add(future); } // 处理Future结果 for (int i 0; i futureList.size(); i) { FutureString future futureList.get(i); try { // 关键设置获取结果的超时时间比如2秒 // 如果某个API调用超过2秒我们就认为它太慢了不再等待。 String result future.get(2, TimeUnit.SECONDS); System.out.println(成功: result); } catch (TimeoutException e) { System.err.println(任务[ i ]执行超时尝试取消。); future.cancel(true); // 尝试中断正在执行的任务 } catch (InterruptedException | ExecutionException e) { System.err.println(任务[ i ]执行异常: e.getCause().getMessage()); } } executor.shutdown(); } }这里的关键是future.get(2, TimeUnit.SECONDS)。它为每个任务设置了2秒的等待上限避免一个慢请求拖死整个处理线程。超时后我们调用future.cancel(true)尝试中断任务注意如果任务代码不响应中断则无法取消。3.2 使用CompletableFuture进行异步编排Future的功能比较基础。CompletableFuture才是现代Java并发编程的利器它支持流式调用、组合多个异步任务功能非常强大。假设我们有这样一个复杂场景先调用SUNFLOWER MATCH LAB的A接口获取一个特征向量。然后用这个向量并发调用B接口和C接口进行两种不同的匹配。最后将B和C的结果合并返回给用户。用CompletableFuture可以优雅地实现import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CompletableFuturePipelineDemo { // 模拟不同的API端点 private String callFeatureApi(String input) throws InterruptedException { Thread.sleep(300); return FeatureVector-of- input; } private String callMatchBApi(String feature) throws InterruptedException { Thread.sleep(400 (int)(Math.random()*200)); return B_Match_Result_for_ feature; } private String callMatchCApi(String feature) throws InterruptedException { Thread.sleep(500 (int)(Math.random()*200)); return C_Match_Result_for_ feature; } private String mergeResults(String resultB, String resultC) { return String.format(合并结果: [%s] 与 [%s], resultB, resultC); } public static void main(String[] args) throws ExecutionException, InterruptedException { CompletableFuturePipelineDemo demo new CompletableFuturePipelineDemo(); // 使用一个自定义的线程池避免使用ForkJoinPool.commonPool()适用于计算密集型 ExecutorService customExecutor Executors.newFixedThreadPool(4); String input UserImage123; // 1. 异步调用A接口获取特征 CompletableFutureString featureFuture CompletableFuture.supplyAsync(() - { try { return demo.callFeatureApi(input); } catch (InterruptedException e) { throw new RuntimeException(e); } }, customExecutor); // 2. 拿到特征后异步并发调用B和C接口 CompletableFutureString matchBFuture featureFuture.thenApplyAsync(feature - { try { return demo.callMatchBApi(feature); } catch (InterruptedException e) { throw new RuntimeException(e); } }, customExecutor); CompletableFutureString matchCFuture featureFuture.thenApplyAsync(feature - { try { return demo.callMatchCApi(feature); } catch (InterruptedException e) { throw new RuntimeException(e); } }, customExecutor); // 3. 等B和C都完成后合并它们的结果 CompletableFutureString finalResultFuture matchBFuture.thenCombine(matchCFuture, demo::mergeResults); // 4. 处理最终结果或异常 finalResultFuture .thenAccept(result - System.out.println(最终成功结果: result)) .exceptionally(ex - { System.err.println(处理流程中出现异常: ex.getMessage()); return null; }); // 主线程等待最终结果在实际Web服务器中这里可能是返回一个Future给前端 String finalResult finalResultFuture.get(); System.out.println(主线程获取到结果: finalResult); customExecutor.shutdown(); } }这段代码清晰地展示了CompletableFuture的链式调用thenApplyAsync和任务组合thenCombine能力。它让异步代码的编写变得像描述业务流程一样直观极大地提升了复杂并发逻辑的可读性和可维护性。4. 实战构建健壮的并发API调用器现在我们把前面学的所有东西组合起来设计一个更健壮、可用于生产环境的并发API调用器。它需要具备并发控制、超时管理、失败重试、结果收集。4.1 设计核心组件我们设计一个BatchApiCaller类。import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; public class BatchApiCaller { private final ThreadPoolExecutor executor; private final MockSunflowerLabClient client; private final int maxRetries; // 最大重试次数 private final long timeoutMs; // 单个任务超时时间 public BatchApiCaller(int corePoolSize, int maxPoolSize, int queueSize, int maxRetries, long timeoutMs) { this.executor new ThreadPoolExecutor( corePoolSize, maxPoolSize, 60, TimeUnit.SECONDS, new ArrayBlockingQueue(queueSize), new ThreadPoolExecutor.CallerRunsPolicy() ); this.client new MockSunflowerLabClient(); this.maxRetries maxRetries; this.timeoutMs timeoutMs; } /** * 批量执行API调用带重试和超时机制 * param taskIds 任务ID列表 * return 成功的结果列表 */ public ListString executeBatch(ListString taskIds) { ListCompletableFutureString futureList new ArrayList(); AtomicInteger successCount new AtomicInteger(0); AtomicInteger failCount new AtomicInteger(0); for (String taskId : taskIds) { CompletableFutureString future CompletableFuture .supplyAsync(() - callWithRetry(taskId), executor) .orTimeout(timeoutMs, TimeUnit.MILLISECONDS) // 为每个Future设置超时 .whenComplete((result, throwable) - { if (throwable ! null) { failCount.incrementAndGet(); System.err.printf(任务[%s]最终失败: %s%n, taskId, throwable.getMessage()); } else { successCount.incrementAndGet(); System.out.printf(任务[%s]成功: %s%n, taskId, result); } }); futureList.add(future); } // 等待所有任务完成无论成功失败 CompletableFutureVoid allFutures CompletableFuture.allOf( futureList.toArray(new CompletableFuture[0]) ); try { allFutures.join(); // 阻塞直到所有future完成 } catch (Exception e) { // 忽略因为单个任务的异常已经在whenComplete中处理了 } System.out.printf(\n批量执行完成。成功: %d, 失败: %d%n, successCount.get(), failCount.get()); // 收集所有成功的结果 return futureList.stream() .map(f - { try { // 获取已完成的结果未完成的异常会抛出CompletionException return f.getNow(null); // getNow不会阻塞如果没完成返回null } catch (CompletionException e) { return null; } }) .filter(Objects::nonNull) .collect(Collectors.toList()); } /** * 带重试机制的调用 */ private String callWithRetry(String taskId) { int retries 0; while (retries maxRetries) { try { return client.callApiSync(taskId -Retry retries); } catch (Exception e) { retries; if (retries maxRetries) { throw new CompletionException(重试 maxRetries 次后失败, e); } System.out.printf(任务[%s]第%d次重试...%n, taskId, retries); try { // 简单的指数退避 Thread.sleep((long) (Math.pow(2, retries) * 100)); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new CompletionException(ie); } } } throw new IllegalStateException(不应到达此处); } public void shutdown() { executor.shutdown(); } }4.2 使用示例与效果public class BatchApiCallerDemo { public static void main(String[] args) { // 配置4核心线程最大8线程队列50最大重试2次超时3秒 BatchApiCaller caller new BatchApiCaller(4, 8, 50, 2, 3000); // 生成50个任务 ListString tasks new ArrayList(); for (int i 0; i 50; i) { tasks.add(BatchTask- i); } long start System.currentTimeMillis(); ListString results caller.executeBatch(tasks); long duration System.currentTimeMillis() - start; System.out.println(\n 执行报告 ); System.out.println(总任务数: tasks.size()); System.out.println(成功结果数: results.size()); System.out.println(总耗时: duration ms); System.out.println(平均每个任务耗时: (duration / (float)tasks.size()) ms); caller.shutdown(); } }运行这个示例你会看到一个健壮的批量处理器在工作。它控制了并发度对失败任务进行了重试对每个任务设置了超时并且最终汇总了成功的结果。这基本上就是一个简化版的、面向外部API调用的并发处理框架。5. 总结通过这个结合SUNFLOWER MATCH LAB API调用的实战演练我希望大家能感受到Java并发的“八股文”背后是实实在在的工程问题。线程池的参数不是背出来的是根据任务类型IO密集型、系统资源和下游服务能力估算出来的。Future和CompletableFuture也不仅仅是面试题它们是管理异步任务生命周期、编排复杂业务流程的利器。回头再看我们其实完成了几件事用线程池管理了并发资源用Future实现了超时控制用CompletableFuture优雅地编排了异步任务最后还整合了重试等容错机制构建了一个相对健壮的批量调用器。这个过程就是把分散的知识点串联成一个解决实际问题的方案。下次面试再被问到“线程池参数”或者“CompletableFuture有什么用”你完全可以把SUNFLOWER MATCH LAB这个例子讲出来。理论结合实践理解自然就深了。当然真实生产环境还会涉及更复杂的方面比如熔断降级、分布式限流、更精细的监控等但核心的并发编程思想已经在这里了。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…