构建自动代码执行器:从任务调度到Docker安全隔离的工程实践

news2026/5/5 2:21:15
1. 项目概述当代码需要自己“跑”起来在开发、测试乃至日常运维的循环里有一个场景我们一定不陌生写好一段脚本配置好一个任务然后需要定期、手动地去执行它。可能是每天凌晨的数据备份可能是每小时的日志分析也可能是代码提交后自动触发的单元测试。手动执行不仅枯燥、容易遗忘更关键的是它打断了我们专注的、创造性的工作流。NeoSkillFactory/auto-code-executor这个项目从名字上就直指了这个痛点——“自动代码执行器”。它的核心目标就是构建一个能够自主、可靠、按需执行代码任务的系统框架。这不仅仅是一个简单的“定时任务”工具。一个成熟的自动代码执行器需要考虑任务的定义与编排、执行环境的隔离与安全、执行结果的捕获与通知、以及任务生命周期的管理如排队、重试、终止。它适用于开发者个人用来自动化日常琐事也适用于团队构建小型的自动化流水线比如自动化的代码质量检查、持续集成中的特定环节或者是数据处理管道中的某个计算节点。简单来说它让代码从被动的“等待执行”状态转变为主动的、可管理的“服务”状态。2. 核心架构设计与技术选型一个健壮的自动执行器其架构必须清晰解耦各司其职。通常我们会采用经典的生产者-消费者模型并融入事件驱动机制。2.1 模块化架构拆解整个系统可以划分为以下几个核心模块任务定义与调度模块这是系统的“大脑”。它负责接收任务创建请求可能是通过API、配置文件或Web界面并将任务按照其调度策略立即执行、定时执行、循环执行、事件触发执行放入待执行队列。一个关键设计点是任务的抽象它应该包含执行代码或代码引用、所需环境、超时时间、重试策略等元数据。任务队列模块作为“大脑”和“四肢”之间的缓冲地带它解耦了任务调度和任务执行。使用消息队列如Redis、RabbitMQ是常见选择。队列保证了在高并发任务提交时执行端可以平稳消费也便于实现任务优先级、延迟执行等高级特性。执行器工作模块这是系统的“四肢”是真正干活的部分。一个或多个执行器Worker从队列中拉取任务。安全隔离是此模块的重中之重。绝不能直接在主机进程或线程中执行不可信代码。通常需要为每个任务创建一个独立的、资源受限的执行环境例如Docker容器最强大的隔离方式。每个任务在一个干净的容器中运行可以自定义镜像彻底隔离文件系统、网络和进程。缺点是启动有一定开销。语言沙箱对于特定语言如Python的subprocess配合资源限制、Node.js的vm模块可以在进程层面进行一定隔离但安全性弱于容器。轻量级虚拟化如gVisor、Firecracker提供了比容器更强、比虚拟机更快的安全隔离。结果处理与持久化模块执行器捕获任务的输出标准输出、标准错误、退出码以及执行时长等信息并将其持久化到数据库如PostgreSQL、MySQL或对象存储中。同时该模块还需集成通知机制如邮件、Slack、Webhook将成功或失败的结果及时反馈给任务提交者。监控与管理接口模块提供API和Web仪表盘用于提交任务、查看任务历史、实时日志、管理执行器状态以及手动干预任务如终止、重试。2.2 关键技术选型考量在实现这样一个系统时技术选型直接决定了系统的能力边界和运维复杂度。队列服务Redis的简单性和高性能使其成为轻量级项目的首选其List或Stream数据结构非常适合做任务队列。对于需要更复杂路由、确认机制和企业级特性的场景RabbitMQ或Apache Kafka是更专业的选择。执行环境对于追求极致安全和环境一致性的场景Docker是事实标准。结合Docker SDK或docker-py库可以编程式地管理容器的生命周期。如果任务全是可信的如内部管理脚本使用操作系统的subprocess配合cgroups进行资源限制也是一种高效方案。持久化存储任务元数据和结果需要被查询。关系型数据库如PostgreSQL在结构化数据和复杂查询方面有优势。如果日志输出非常庞大可以考虑将其存入Elasticsearch便于搜索或直接存入S3兼容的对象存储。开发语言选择一种生态丰富、在系统编程和并发处理上表现良好的语言。Go语言以其高并发、跨平台编译和部署简单的特性非常适合编写执行器Worker。Python则以其简洁和强大的生态尤其在数据分析、机器学习任务中见长适合快速构建调度器和API。许多成熟的项目如Apache Airflow即采用Python作为核心。注意安全是第一生命线。自动执行任意代码是极其危险的操作。必须实施严格的准入控制如代码签名、来源白名单、资源限制CPU、内存、运行时间和网络隔离禁止外网访问或仅允许访问特定端点。永远假设被执行的代码是恶意的。3. 核心功能实现与实操步骤让我们以一个简化但完整的Python实现为例勾勒出一个自动代码执行器的核心骨架。我们将使用Redis作为队列Docker作为执行环境Flask提供API。3.1 任务定义与提交API首先我们需要定义任务的格式并提供一个HTTP端点来接收它。# schemas.py from pydantic import BaseModel, Field from enum import Enum from typing import Optional, Dict, Any from datetime import datetime class TaskStatus(str, Enum): PENDING pending RUNNING running SUCCESS success FAILED failed TIMEOUT timeout class Task(BaseModel): task_id: str Field(default_factorylambda: str(uuid.uuid4())) code: str # 需要执行的代码字符串或包含代码的Git仓库地址 language: str python # python, bash, node等 environment: Dict[str, str] Field(default_factorydict) # 环境变量 timeout_seconds: int 300 schedule_at: Optional[datetime] None # 可选定时执行 created_at: datetime Field(default_factorydatetime.utcnow) status: TaskStatus TaskStatus.PENDING# api.py from flask import Flask, request, jsonify import redis from schemas import Task import json app Flask(__name__) redis_client redis.Redis(hostlocalhost, port6379, db0) TASK_QUEUE_KEY auto_executor:tasks app.route(/api/v1/task, methods[POST]) def submit_task(): try: task_data request.json task Task(**task_data) # 将任务序列化后推入Redis队列 redis_client.lpush(TASK_QUEUE_KEY, task.json()) return jsonify({task_id: task.task_id, status: queued}), 202 except Exception as e: return jsonify({error: str(e)}), 400这个API接收一个JSON请求验证后生成一个唯一任务ID并将其序列化为JSON字符串推入Redis列表的左侧。返回202 Accepted状态码和任务ID表示任务已接受排队。3.2 执行器Worker的实现执行器是一个独立的后台进程它循环地从队列中取出任务并执行。# worker.py import redis import json import docker from schemas import Task, TaskStatus import logging import asyncio logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) class CodeExecutorWorker: def __init__(self): self.redis_client redis.Redis(hostlocalhost, port6379, db0) self.docker_client docker.from_env() self.task_queue_key auto_executor:tasks self.running True def run(self): logger.info(Code executor worker started.) while self.running: # 从队列右侧阻塞弹出任务最长等待10秒 _, task_json self.redis_client.brpop(self.task_queue_key, timeout10) if not task_json: continue task_data json.loads(task_json) task Task(**task_data) self._execute_task(task) def _execute_task(self, task: Task): logger.info(fStarting task {task.task_id}) # 更新任务状态为运行中可存入数据库 # 这里简化为日志输出 container None try: # 1. 准备执行环境使用一个包含Python的轻量级镜像 # 根据task.language选择不同镜像 image_name python:3.9-slim if task.language python else alpine # 2. 创建容器将代码作为命令或写入文件执行 # 这里示例将代码写入容器内的临时文件并执行 container self.docker_client.containers.run( imageimage_name, commandfpython -c \{task.code}\, # 注意简单示例代码中不能有复杂引号 # 更安全的做法是将代码写入宿主机文件然后挂载到容器 # command[python, /tmp/user_code.py], # volumes{host_code_path: {bind: /tmp/user_code.py, mode: ro}}, environmenttask.environment, mem_limit512m, # 限制内存 cpu_period100000, cpu_quota50000, # 限制CPU为50% network_disabledTrue, # 禁用网络增强安全 detachTrue, # 后台运行 ) # 3. 等待容器执行完成或超时 result container.wait(timeouttask.timeout_seconds) exit_code result[StatusCode] logs container.logs(stdoutTrue, stderrTrue).decode(utf-8) # 4. 处理结果 if exit_code 0: status TaskStatus.SUCCESS logger.info(fTask {task.task_id} succeeded.\nLogs:\n{logs}) else: status TaskStatus.FAILED logger.error(fTask {task.task_id} failed with exit code {exit_code}.\nLogs:\n{logs}) except docker.errors.ContainerError as e: status TaskStatus.FAILED logs str(e) logger.error(fContainer error for task {task.task_id}: {e}) except Exception as e: status TaskStatus.FAILED logs str(e) logger.exception(fUnexpected error executing task {task.task_id}) finally: # 5. 清理容器 if container: try: container.remove(forceTrue) except: pass # 6. 将最终状态和日志持久化此处应存入数据库 logger.info(fTask {task.task_id} finished with status: {status}) if __name__ __main__: worker CodeExecutorWorker() try: worker.run() except KeyboardInterrupt: worker.running False logger.info(Worker shutting down.)这个Worker实现了一个最核心的循环从Redis取任务 - 用Docker运行 - 收集结果 - 清理。它包含了基本的资源限制和网络隔离。3.3 任务状态查询与日志获取任务提交后用户需要能查询状态和结果。我们需要另一个API端点和一个存储层这里用Redis模拟生产环境应用数据库。# api.py (续) RESULTS_KEY_PREFIX auto_executor:result: app.route(/api/v1/task/task_id, methods[GET]) def get_task_result(task_id): result_key f{RESULTS_KEY_PREFIX}{task_id} result_json redis_client.get(result_key) if not result_json: return jsonify({error: Task not found or not finished}), 404 result_data json.loads(result_json) return jsonify(result_data), 200在Worker的_execute_task方法最后我们需要将结果存入这个存储中。# 在worker.py的_execute_task方法finally块中加入 result_payload { task_id: task.task_id, status: status, exit_code: exit_code if exit_code in locals() else None, logs: logs, finished_at: datetime.utcnow().isoformat() } self.redis_client.setex( f{RESULTS_KEY_PREFIX}{task.task_id}, time86400, # 结果保留24小时 valuejson.dumps(result_payload) )4. 高级特性与生产环境考量基础框架搭建完成后要使其成为一个可靠的生产级工具还需要考虑更多。4.1 任务依赖与工作流编排简单的独立任务不够。现实中的自动化流程往往包含多个步骤例如“拉取代码 - 运行测试 - 生成报告 - 发送通知”。这就需要引入**有向无环图DAG**来定义任务间的依赖关系。我们可以扩展Task模型增加一个dependencies字段存储其依赖的前置任务ID列表。调度器在将任务放入队列前需要检查其所有依赖任务是否都已成功完成。这引入了状态管理的复杂性通常需要一个持久化数据库来跟踪所有任务的状态。像Apache Airflow这样的专业调度系统其核心就是一个强大的DAG执行引擎。4.2 执行器集群与负载均衡单个执行器Worker容易成为瓶颈和单点故障。我们需要部署多个Worker并让它们协同工作。队列分发所有Worker监听同一个Redis队列。Redis的BRPOP命令是原子性的可以保证一个任务只会被一个Worker取走天然实现了负载均衡。** Worker注册与发现**为了实现更精细的管理如指定特定类型的Worker运行特定任务可以引入一个注册中心。每个Worker启动时将自己的能力支持的语言、资源余量注册到Redis或数据库中。调度器在派发任务时可以根据这些信息进行智能路由。心跳与健康检查主节点或监控系统需要定期检查Worker是否存活。Worker可以定期向一个公共键如auto_executor:worker:heartbeat:worker_id写入时间戳。超过一定时间未更新的Worker被视为下线其正在运行的任务可能需要被重新调度。4.3 安全加固的进阶策略基础的安全隔离只是第一步。代码审计与白名单对于高度敏感的环境不能直接执行任意代码字符串。可以改为只允许执行经过审核的、存储在特定Git仓库中特定分支的脚本。任务提交时只提供仓库地址、分支和脚本路径Worker在容器内拉取代码执行。细粒度资源控制除了内存和CPU还可以限制磁盘I/O、进程数、文件描述符数量等。在Docker中可以使用--blkio-weight、--pids-limit等参数。用户命名空间隔离在容器内默认以root用户运行存在风险。应使用--user参数指定一个非特权用户UID或者在Dockerfile中创建专用用户。只读文件系统除非必要将容器的根文件系统挂载为只读--read-only只将需要写入的特定目录如/tmp以卷的形式挂载。Seccomp与AppArmor配置文件使用严格的安全计算模式Seccomp和AppArmor配置文件限制容器内可以进行的系统调用这是防止容器逃逸的重要手段。4.4 监控、日志与可观测性一个运行在后台的系统必须有完善的眼睛和耳朵。指标收集使用Prometheus客户端库在Worker中暴露指标如已处理任务数、正在运行任务数、任务耗时分布直方图、任务失败率等。这些指标可以通过Grafana进行可视化。结构化日志将日志输出为JSON格式包含task_id、timestamp、level、message等固定字段。这样可以通过ELKElasticsearch, Logstash, Kibana或Loki进行高效的日志聚合与查询。分布式追踪对于复杂的任务链引入如Jaeger或Zipkin的分布式追踪为每个任务生成一个唯一的Trace ID并贯穿于所有相关的日志和调用中使得排查跨进程、跨服务的复杂问题变得清晰。5. 常见问题与实战排坑指南在实际部署和运行过程中你会遇到各种各样的问题。以下是一些典型场景及其解决方案。5.1 任务执行超时与僵尸进程问题现象任务因超时被标记为失败但对应的Docker容器或子进程并未退出成为“僵尸”持续占用资源。根因分析container.wait(timeout)超时后会抛出异常但容器可能因为代码陷入死循环、等待外部资源而被卡住并未被终止。解决方案双重超时控制在调用docker run时除了使用wait(timeout)还应该使用docker run的timeout参数如果所用SDK支持或在发送终止信号前设置一个更短的超时。强制清理在finally块或超时处理中不仅要container.remove()更应先尝试container.stop(timeout5)给容器一个优雅退出的机会然后再强制移除。独立监控线程启动一个后台线程专门监控所有运行中容器的执行时间对超时的容器主动发起终止操作。# 改进的容器运行与等待逻辑 try: container self.docker_client.containers.run(..., detachTrue) # 等待执行完成但设置一个稍短于任务超时的时间留出清理时间 wait_timeout task.timeout_seconds - 5 result container.wait(timeoutwait_timeout) exit_code result[StatusCode] except (docker.errors.APIError, ReadTimeoutError): # 等待超时尝试停止容器 logger.warning(fTask {task.task_id} timed out, stopping container.) try: container.stop(timeout5) except: pass status TaskStatus.TIMEOUT finally: if container: try: container.remove(forceTrue) # 最终强制移除 except: pass5.2 队列消息丢失与任务重复执行问题现象任务莫名消失或者同一个任务被执行了两次。根因分析丢失Worker在从队列取出消息后、处理完成前崩溃消息未被正确处理也未放回队列。重复网络分区或Worker处理时间过长导致队列认为消费者失效将消息重新分发给其他Worker。解决方案使用更可靠的消息传递模式。使用Redis Streams替代ListStreams支持消费者组和消息确认ACK机制。Worker消费消息后必须显式发送ACK消息才会被标记为已处理。如果Worker崩溃未ACK的消息会被重新分配给组内其他消费者。实现至少一次at-least-once语义任务处理逻辑必须是幂等的。即使同一个任务ID被处理多次最终结果也应该是一致的。可以通过在任务开始执行前在数据库中设置一个“处理中”状态锁来实现。5.3 执行环境依赖与构建效率问题现象用户任务需要特定的第三方库如pandas,tensorflow每次启动纯净容器都需要重新安装耗时极长。解决方案预构建基础镜像针对常用的语言和环境如python:3.9-with-data-science提前构建好包含常用库的Docker镜像并推送到私有镜像仓库。Worker根据任务标签选择对应的镜像。分层缓存与BuildKit如果允许用户通过Dockerfile定义环境可以利用Docker的分层缓存和BuildKit的缓存导出/导入功能大幅加速镜像构建过程。持久化Volume缓存将包管理器的缓存目录如Python的pip cacheNode.js的npm cache通过Docker Volume挂载到宿主机这样即使容器销毁缓存仍在下次构建时无需重新下载。5.4 资源竞争与死锁问题现象在高并发下系统出现不稳定或任务长时间处于等待状态。根因分析多个Worker或任务竞争同一资源如数据库连接、某个锁、宿主机上的特定端口。解决方案数据库连接池确保每个Worker使用连接池访问数据库而不是为每个任务创建新连接。分布式锁当任务需要访问共享资源时使用Redis或ZooKeeper实现分布式锁。例如某个任务需要操作一个共享文件在操作前先获取锁。限制并发度控制单个Worker上同时运行的任务数以及全局同时运行的任务总数。可以在Worker启动时设置一个信号量Semaphore在拉取任务前先获取许可。全局并发度可以通过数据库中的计数器或Redis的原子操作来实现。import threading semaphore threading.Semaphore(5) # 单个Worker最多同时执行5个任务 def run(self): while self.running: with semaphore: # 获取执行槽位 _, task_json self.redis_client.brpop(self.task_queue_key, timeout10) if task_json: # ... 执行任务构建一个稳定、高效、安全的自动代码执行器是一个从简单到复杂不断迭代和加固的过程。它涉及分布式系统、容器技术、安全工程和软件工程等多个领域的知识。从最初的一个脚本到一个支持集群、工作流、安全隔离和全面监控的平台每一步的演进都是为了同一个目标让机器可靠地为我们执行重复的代码劳动从而释放出我们宝贵的创造力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2583568.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…