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

【嵌入式学习6】多任务版TCP服务器

目录

如何实现:

客户端1.0版本:

服务端:

客户端2.0版本:

thread.join() 是一个线程同步方法,用于主线程等待子线程完成。当你调用 thread.join() 时,主线程会阻塞,直到调用 join() 的子线程完成其执行。

同步机制

如何实现同步机制:

threading.Lock() 是一个互斥锁(Mutex Lock),用于确保同一时间只有一个线程可以执行特定的代码块。它主要用于保护共享资源,避免多线程环境下的竞态条件和数据不一致问题


开发一个多任务版的TCP服务端程序能够服务于多个客户端。

如何实现:
  1. TCP服务端程序,循环等待接受客户端的连接请求
  2. 当客户端和服务端建立连接成功,创建子线程专门处理客户端的请求,防止主线程阻塞
  3. 把创建的子线程设置成为守护主线程,防止主线程无法退出,避免主线程结束时,子线程还在运行
客户端1.0版本:
import socket
import threadingdef link1():tcp_c1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcp_c1.connect(('127.0.0.1',8888))tcp_c1.send('客户端1连接成功'.encode('utf-8'))recv_data = tcp_c1.recv(1024)print("接收到数据:",recv_data.decode('utf-8'))tcp_c1.close()def link2():tcp_c2 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcp_c2.connect(('127.0.0.1',8888))tcp_c2.send('客户端2连接成功'.encode('utf-8'))recv_data = tcp_c2.recv(1024)print("接收到数据:",recv_data.decode('utf-8'))tcp_c2.close()def link3():tcp_c3 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)tcp_c3.connect(('127.0.0.1',8888))tcp_c3.send('客户端3连接成功'.encode('utf-8'))recv_data = tcp_c3.recv(1024)print("接收到数据:",recv_data.decode('utf-8'))tcp_c3.close()if __name__ == '__main__':c1 = threading.Thread(target=link1)c2 = threading.Thread(target=link2)c3 = threading.Thread(target=link3)c1.start()c2.start()c3.start()
服务端:
import socket
import threadingdef handle(service_client_socket,ip_port):while True:recv_data = service_client_socket.recv(1024)if recv_data:print(recv_data.decode('utf-8'),ip_port)service_client_socket.send("收到客户端信息".encode('utf-8'))else:print("客户端下线",ip_port)breakservice_client_socket.close()if __name__ == '__main__':tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)# 端口复用让程序退出端口号立即释放tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)tcp_server_socket.bind(('',8888))tcp_server_socket.listen(128)# tcp服务端循环等待客户端连接请求while True:# 给客户端创建子线程处理相关内容service_client_socket,ip_port = tcp_server_socket.accept()print('\n客户端正在连接',ip_port)new_client = threading.Thread(target=handle,args=(service_client_socket,ip_port))# 将子线程设置为守护线程new_client.daemon = Truenew_client.start()
setsockopt :Python socket 模块中的一个方法,用于设置套接字的选项
  • level:指定选项所在的协议级别。常见的值包括:

    • socket.SOL_SOCKET:套接字级别的选项。

    • socket.IPPROTO_TCP:TCP 协议级别的选项。

    • socket.IPPROTO_IP:IP 协议级别的选项。

  • option:指定要设置的选项名称。常见的选项包括:

    • socket.SO_REUSEADDR:允许套接字绑定到一个处于 TIME_WAIT 状态的地址和端口

    • socket.SO_KEEPALIVE:启用 TCP 保活机制,保活机制会定期发送探测包,以检测连接是否仍然有效。如果对方主机在一定时间内没有响应,连接将被关闭

    • socket.TCP_NODELAY:禁用 Nagle 算法,立即发送数据,Nagle 算法会将多个小数据包合并成一个大数据包发送,以提高网络效率

    • socket.SO_BROADCAST:允许套接字发送广播消息。这在实现广播功能时非常有用,例如在局域网内广播服务器地址

  • value:指定选项的值。通常是一个整数,表示选项的状态(如 1 表示启用,0 表示禁用)。

运行结果:

不难发现我们手动创建客户端会出现大量重复代码,可扩展可维护性较低,于是我们可以优化客户端生成代码,动态生成客户端

客户端2.0版本:
def client_thread(client_id):tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_client.connect(('127.0.0.1', 8888))tcp_client.send(f'客户端{client_id}正在连接'.encode('utf-8'))recv_data = tcp_client.recv(1024)print(f"客户端{client_id}接收到数据:", recv_data.decode('utf-8'))tcp_client.close()if __name__ == '__main__':threads = []for i in range(1, 4):  # 创建3个客户端thread = threading.Thread(target=client_thread, args=(i,))threads.append(thread)thread.start()for thread in threads:thread.join()
thread.join() 是一个线程同步方法,用于主线程等待子线程完成。当你调用 thread.join() 时,主线程会阻塞,直到调用 join() 的子线程完成其执行。

同步机制

观察上图,我们可以看见客户端和服务端的连接和断开行为并不是完全同步的,这主要是由于多线程和网络通信的特性导致的。

假设客户端1、客户端2和客户端3按顺序启动,但实际执行顺序可能是这样的:

  1. 客户端1启动并发送消息,服务端接收并处理。

  2. 客户端2启动并发送消息,服务端接收并处理。

  3. 客户端1关闭连接,服务端检测到客户端1关闭并打印“客户端1下线”。

  4. 客户端3启动并发送消息,服务端接收并处理。

  5. 客户端2关闭连接,服务端检测到客户端2关闭并打印“客户端2下线”。

  6. 客户端3关闭连接,服务端检测到客户端3关闭并打印“客户端3下线”。

如何实现同步机制:

①在客户端和服务端之间引入同步机制,例如使用线程锁(threading.Lock)或信号量(threading.Semaphore)来控制线程的执行顺序

②在客户端和服务端的线程中添加同步点,确保每个客户端的连接和断开操作都完成后再进行下一个客户端的操作

③使用队列(queue.Queue)来管理客户端的连接和断开操作,确保按顺序处理每个客户端的请求

服务端:

import socket
import threading
import timedef handle(service_client_socket, ip_port):with lock:while True:recv_data = service_client_socket.recv(1024)if recv_data:print(recv_data.decode('utf-8'), ip_port)service_client_socket.send("收到客户端信息".encode('utf-8'))else:print("客户端下线", ip_port)breakservice_client_socket.close()time.sleep(1)  # 确保按顺序处理if __name__ == '__main__':tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)tcp_server_socket.bind(('', 8888))tcp_server_socket.listen(128)lock = threading.Lock()while True:service_client_socket, ip_port = tcp_server_socket.accept()print('\n客户端正在连接', ip_port)new_client = threading.Thread(target=handle, args=(service_client_socket, ip_port))new_client.daemon = Truenew_client.start()

客户端:

import socket
import threading
import timelock = threading.Lock()def client_thread(client_id):with lock:tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)tcp_client.connect(('127.0.0.1', 8888))tcp_client.send(f'客户端{client_id}连接成功'.encode('utf-8'))recv_data = tcp_client.recv(1024)print(f"客户端{client_id}接收到数据:", recv_data.decode('utf-8'))tcp_client.close()time.sleep(1)  # 确保按顺序关闭连接if __name__ == '__main__':threads = []for i in range(1, 4):thread = threading.Thread(target=client_thread, args=(i,))threads.append(thread)thread.start()for thread in threads:thread.join()
threading.Lock() 是一个互斥锁(Mutex Lock),用于确保同一时间只有一个线程可以执行特定的代码块。它主要用于保护共享资源,避免多线程环境下的竞态条件和数据不一致问题
  • with lock 的作用

    • with lock 是一个上下文管理器,用于自动管理锁的获取和释放。

    • 当进入 with 块时,自动调用 lock.acquire(),获取锁。

    • 当退出 with 块时,自动调用 lock.release(),释放锁。

    • 使用 with 语句可以简化锁的管理,避免因异常导致锁未释放的情况。

accept的作用:

        accept 函数的作用是接受一个已经建立的连接。当服务器端套接字调用 listen 函数进入监听状态后,它会等待客户端的连接请求。当一个客户端请求连接时,服务器端套接字可以调用 accept 函数来接受这个连接。

 accept 是否阻塞,这取决于它的使用方式:
  1. 阻塞模式:在默认情况下,accept 函数是阻塞的。这意味着如果当前没有客户端连接请求,accept 函数会暂停执行,直到一个连接请求到达。这种模式适用于服务器端希望立即处理客户端连接的情况。

  2. 非阻塞模式:如果服务器端套接字被设置为非阻塞模式,那么 accept 函数将不会等待连接请求。如果当前没有客户端连接请求,accept 函数会立即返回一个错误(通常是EWOULDBLOCK或EAGAIN)。这种模式适用于服务器端需要同时处理其他任务,不希望因为等待连接请求而被阻塞的情况。

相关文章:

【嵌入式学习6】多任务版TCP服务器

目录 如何实现: 客户端1.0版本: 服务端: 客户端2.0版本: thread.join() 是一个线程同步方法,用于主线程等待子线程完成。当你调用 thread.join() 时,主线程会阻塞,直到调用 join() 的子线程…...

抖音直播位置与IP属地不同?如何实现

抖音作为头部平台吸引了大量主播和观众。然而,许多用户发现一个令人困惑的现象:直播间显示的位置信息与账号IP属地不一致。本文将深入分析这一现象背后的原因,探讨可能带来的影响,并提供实用的解决方案。 一、抖音直播显示的位置与…...

Scala(六)

本节课学习了数组、列表、Set集合、Map集合、元组、集合中常用的函数等等。 数组包括可变数组、不可变数组,学习了如何定义和创建数组、可变数组和不可变数组之间的转换、多维数组、数组遍历 列表学习了如何添加元素、合并集合、如何访问元素、遍历列表 Set集合学…...

Android 11.0 framework系统首次开机添加锁屏壁纸的功能

1.前言 在11.0的系统rom定制化开发中,在某些时候需要默认设置锁屏壁纸功能,而系统中没有在 framework/base下没有单独的默认锁屏壁纸的图片替换,默认就是锁屏壁纸和主屏幕壁纸 都是同一张壁纸,所以就需要添加接口来实现设置默认锁屏壁纸的功能 2.framework系统首次开机添…...

Scala数组

数组 - 可变数组:以 ArrayBuffer 创建,可灵活增删改元素 ,如 ArrayBuffer(1, 2, 3) ,并通过 append 等方法操作。 - 不可变数组:由 Array 构建,创建后元素不可变,可借助 toBuffer 等方法转换为…...

Win11 24H2用户个性化设置OOBE跳过微软账户使用本地账户方法

目前Win11已经更新到24H2版本,经过小编测试,已经有两种方法失效了,分别如下。 1.shiftFnF10,oobe \bypassnro 2.微软账户注册界面,输入特定邮件地址和随机密码,例如nothankyou.com、exampleexample.com等…...

遍历集合list工具

文章目录 1.遍历集合list,返回第一个匹配的对象/不匹配返回null:2.集合list排序3.遍历list对象,返回匹配的集合4.从 dbRepeaters 列表中筛选出所有 repeaterId 在 repeaterIds 数组中的 Repeater 对象,并将这些对象收集到一个新的…...

基于 SmartX 原生容灾能力构建简单经济的容灾方案:5 大场景与 4 例实践合集

不少企业都基于虚拟化/超融合架构支持多种核心应用系统与数据库。这些场景不仅涉及多种类型的工作负载,在数据可靠性层面也需要不同级别的保护策略,一些用户还面临灾备演练、集中容灾等更多样的容灾需求,因此,构建全面可靠、易用高…...

说一下分布式组件时钟一致性的解决方案

为什么需要时钟一致性? 在分布式系统中,时钟一致性是确保各节点时间同步的关键问题。 时钟不同步可能导致日志混乱、事务顺序错误、数据不一致等问题 1. 物理时钟同步 基础方案:NTP(网络时间协议) 原理&#xff1a…...

aws s3api 常用命令

AWS S3API 是 Amazon Web Services&#xff08;AWS&#xff09;提供的用于与简单存储服务&#xff08;S3&#xff09;进行交互的命令行工具&#xff0c;以下是一些常用命令&#xff1a; 桶操作 创建桶 aws s3api create-bucket --bucket <bucket-name> --region <r…...

006 ElementUI

https://element.eleme.cn/#/zh-CN ElementUI是组件库&#xff0c;网站快速成型工具 npm i element-ui2.12.0在 main.js 中写入以下内容&#xff1a; import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css; Vue.use(ElementUI);...

el-select组件与el-tree组件结合实现下拉选择树型结构框

下拉选择树型结构框 实现效果图组件完整代码 实现效果图 组件完整代码 <template><div class"tree-con"><el-selectv-model"value"placeholder"请选择"class"bs-select"ref"select"><el-optionv-for&…...

windows系统更新nvidia 驱动, 并安装pytorch

windows系统更新nvidia 驱动&#xff0c; 并安装pytorch 1.更新前nvidia-smi 显示版本比较久 2.方法一&#xff1a;通过NVIDIA GeForce Experience自动更新 NVIDIA GeForce Experience是NVIDIA官方提供的一款软件&#xff0c;它不仅可以帮助用户优化游戏设置&#xff0c;还能…...

如何深刻理解Reactor和Proactor

前言&#xff1a; 网络框架的设计离不开 I/O 线程模型&#xff0c;线程模型的优劣直接决定了系统的吞吐量、可扩展性、安全性等。目前主流的网络框架&#xff0c;在网络 IO 处理层面几乎都采用了I/O 多路复用方案(又以epoll为主)&#xff0c;这是服务端应对高并发的性能利器。 …...

如何使用WRF-Hydro GIS工具,生成运行WRF-Hydro模型的Domain文件,包括流域、地形、河网、湖泊等

WRF-Hydro模型作为一个集成了大气和水文过程的模型&#xff0c;具有一些挑战性的难点&#xff0c;包括&#xff1a; 复杂的耦合过程&#xff1a;WRF-Hydro模型需要同时考虑大气和水文过程的相互作用&#xff0c;包括降水、蒸发、径流等一系列过程的耦合&#xff0c;这使得模型的…...

adb devices报错 ADB server didn‘t ACK

ubuntu下连接手机首次使用adb devices 报错ADB server didn’t ACK adb devices * daemon not running; starting now at tcp:5037 ADB server didnt ACK Full server startup log: /tmp/adb.1000.log Server had pid: 52986 --- adb starting (pid 52986) --- 04-03 17:23:23…...

机器学习——决策树

1.什么要学习决策树&#xff1f; 处处都是选择,并且到处都是岔路口。比如你发现某只股票几天时间内涨了很多,如果是你,你会买进吗&#xff1f;如果买进了,你就得承担后果,要么会大赚一笔,要么会血本无归。总之&#xff0c;用算法替代主观判断&#xff0c;避免情绪化投资决策。 …...

zk源码—2.通信协议和客户端原理二

大纲 1.ZooKeeper如何进行序列化 2.深入分析Jute的底层实现原理 3.ZooKeeper的网络通信协议详解 4.客户端的核心组件和初始化过程 5.客户端核心组件HostProvider 6.客户端核心组件ClientCnxn 7.客户端工作原理之会话创建过程 6.客户端核心组件ClientCnxn (1)客户端核心…...

Python设计模式:构建模式

1. 什么是构建模式 构建模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它允许使用多个简单的对象一步步构建一个复杂的对象。构建模式通过将构建过程与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。换句话说&#xff0c;构建模…...

C++类间的 “接力棒“ 传递:继承(下)

文章目录 5. 继承与友元6.继承与静态成员7.菱形继承8.继承和组合希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 本篇接着补充继承方面的内容&#xff0c;同时本篇的菱形继承尤为重要 5. 继承与友元 class Student; class Person { public:fri…...

C++11QT复习 (十六)

文章目录 Day11 移动语义回顾一、移动语义基础概念二、自定义 String 类的移动语义实现输出运算符重载&#xff1a; 三、测试函数&#xff1a;验证移动与拷贝行为四、左值与右值的补充说明右值引用作为函数返回值 五、知识总结如何区分左值与右值&#xff1f; 六、附加说明&…...

Redis客户端命令到服务器底层对象机制的完整流程?什么是Redis对象机制?为什么要有Redis对象机制?

Redis客户端命令到服务器底层对象机制的完整流程 客户端 → RESP协议封装 → TCP传输 → 服务器事件循环 → 协议解析 → 命令表查找 → 对象机制 → 动态编码 → 数据结构操作 → 响应编码 → 网络回传 Redis客户端命令到服务器底层对象机制的完整流程可分为协议封装、命令解…...

鸿蒙NEXT开发节流、防抖工具类(ArkTs)

import { CacheUtil } from ./CacheUtil; import { DateUtil } from ./DateUtil;/*** 节流、防抖工具类&#xff08;用于点击事件&#xff0c;防止按钮被重复点击&#xff09;** author 鸿蒙布道师* since 2025/04/07*/ export class ClickUtil {private static throttleTimeou…...

Qt程序 Windows打包

目的 运行Qt的程序&#xff0c;遇上如下问题&#xff1a; 显然是少很多Qt库&#xff0c;那就把Qt库放到这里&#xff0c;Qt提供这一个命令windeployqt.exe. windeployqt windeployqt是Qt框架提供的一个工具&#xff0c;主要用于自动打包Windows平台上的Qt应用程序及其依赖项…...

2025-04-07(DS复习):Databricks DLT 详解

Databricks Delta Live Tables (DLT) 详解 Delta Live Tables (DLT) 是 Databricks 提供的一个智能框架&#xff0c;用于构建可靠、可扩展的数据处理管道。它简化了ETL(提取、转换、加载)和ELT(提取、加载、转换)流程的开发和管理&#xff0c;特别适合在数据湖house架构中实现…...

音视频入门基础:RTCP专题(3)——RTCP协议简介(中)

本文接着《音视频入门基础&#xff1a;RTCP专题&#xff08;2&#xff09;——RTCP协议简介&#xff08;上&#xff09;》&#xff0c;继续对RTCP协议进行简介。本文的一级标题从“九”开始。 九、Sender and Receiver Reports 本段内容对应《RFC 3550》的第6.4节。根据《RFC …...

嵌入式工程师多线程编程(二)生产者-消费者模式

生产者-消费者模式详解&#xff1a;多线程编程的核心范式 生产者-消费者模式(Producer-Consumer Pattern)是多线程编程中最经典的设计模式之一&#xff0c;它通过解耦生产者和消费者的工作流程&#xff0c;实现了线程间的高效协作与资源管理。本文将深入剖析这一模式的原理、实…...

秒杀系统的性能优化

秒杀任务总体QPS预期是每秒几十万&#xff0c;对tomcat、redis、JVM参数进行优化。 tomcat线程数 4核8G的机器&#xff0c;一般就是开200-300个工作线程&#xff0c;这是个经验值。每秒一个线程处理3-5个请求&#xff0c;200多个线程的QPS可以达到1000左右。线程不能太多&…...

MySQL学习笔记集--索引

索引 索引是数据库中用于提高查询效率的一种数据结构。 它类似于书籍的目录&#xff0c;通过索引可以快速定位到表中的特定行&#xff0c;而无需扫描整个表。 索引的类型 主键索引&#xff08;Primary Key Index&#xff09; 自动创建&#xff0c;用于唯一标识表中的每一行。…...

深入理解重排(Reflow)与重绘(Repaint),写出高性能 CSS 动画

在前端开发中&#xff0c;CSS 动画是提升用户体验的重要手段&#xff0c;但很多开发者在使用动画时并不了解浏览器背后的渲染机制&#xff0c;导致动画卡顿甚至影响整体性能。本文将带你深入理解 CSS 中的两大核心概念 —— 重排&#xff08;Reflow&#xff09; 与 重绘&#x…...

Elasticsearch 从入门到实战:文档聚合操作及总结

四、文档操作&#xff1a;数据的增删改查 4.1 添加文档 文档&#xff08;Document&#xff09;是索引中的最小数据单元&#xff0c;使用 POST 或 PUT 添加&#xff1a; json POST /products/_doc/1 { "name": "华为Mate50 Pro", "price": 6…...

前缀和和差分笔记

前缀和和差分笔记 一维前缀和 示意图如下&#xff1a; 代码&#xff1a; **核心公式&#xff1a;sum[i]sum[i-1]a[i];&#xff08;计算前缀和的&#xff09;**#include<bits/stdc.h> using namespace std; const int N10000; #define ll long long int a[N],sum[N]; i…...

SSRF漏洞利用的小点总结和实战演练

含义理解&#xff1a; SSRF&#xff08;Server-Side Request Forgery&#xff0c;服务器请求伪造&#xff09;是一种由攻击者构造请求&#xff0c;由服务端发起请求的安全漏洞&#xff0c;一般情况下&#xff0c;SSRF攻击的目标是外网无法访问的内网系统。 攻击者通过篡改URL…...

IAR推动嵌入式开发:云就绪、可扩展的CI/CD和可持续自动化

全球领先的嵌入式系统开发软件解决方案供应商IAR正式发布全新云就绪平台&#xff0c;为嵌入式开发团队提供企业级的可扩展性、安全性和自动化能力。该平台于在德国纽伦堡举办的embedded world 2025展会上正式亮相&#xff0c;标志着将现代DevSecOps工作流集成到嵌入式软件开发中…...

瓦片数据合并方法

影像数据 假如有两份影像数据 1.全球底层影像0-5级别如下&#xff1a; 2.局部高清影像数据级别9-14如下&#xff1a; 合并方法 将9-14文件夹复制到全球底层0-5的目录下 如下&#xff1a; 然后合并xml文件 使得Tileset设置到最高级&#xff08;包含所有级别&#xff09;&…...

RISC-V AIA学习---IPI 处理器间中断

对于有多个hart的机器&#xff0c;必须为每个 hart 提供一个由具体实现定义的内存地址。向这个地址写入数据&#xff0c;就能向该 hart 发送一个机器级软件中断&#xff08;主代码为 3&#xff09;。换句话说&#xff0c;机器级的 IPI 可以通过这种方式&#xff0c;以机器级软件…...

Automattic 裁员16%,Matt Mullenweg称此举旨在提升盈利能力并增强投资实力

2025年4月3日&#xff0c;Automattic——这家以 WordPress.com、Tumblr 和 WooCommerce 等产品闻名的公司&#xff0c;宣布裁减其全球员工队伍的16%。这一决定是在周三通过公司博客文章和 Slack 内部消息向员工透露的。根据裁员前 Automattic 官网显示的员工人数&#xff08;1,…...

图解AUTOSAR_SWS_FlexRayInterface

AUTOSAR FlexRay Interface 模块分析 本文档基于AUTOSAR SWS FlexRayInterface规范,对FlexRay Interface模块进行详细分析。 1. FlexRay Interface 模块架构 1.1 模块架构概览 1.2 架构说明 FlexRay Interface模块是AUTOSAR中的ECU抽象层组件,为上层模块提供统一的抽象接…...

AI赋能ArcGIS Pro——水系网络AI智能提取 | GIS人工智能制图技术解析

我们之前做了做了几期的AIGIS的分享。我们今天要再次做一个分享。 AI赋能ArcGIS Pro——水系网络智能提取全解析 DeepSeek结合ArcGIS Pro制作一个批量建库的脚本工具&#xff08;代码一字未改&#xff0c;直接运行&#xff09; 看老外如何玩DeepSeek&#xff01;15分钟快速创…...

STM32江科大----IIC

声明&#xff1a;本人跟随b站江科大学习&#xff0c;本文章是观看完视频后的一些个人总结和经验分享&#xff0c;也同时为了方便日后的复习&#xff0c;如果有错误请各位大佬指出&#xff0c;如果对你有帮助可以点个赞小小鼓励一下&#xff0c;本文章建议配合原视频使用❤️ 如…...

RAG(检索增强生成)系统,提示词(Prompt)表现测试(数据说话)

在RAG(检索增强生成)系统中,评价提示词(Prompt)设计是否优秀,必须通过量化测试数据来验证,而非主观判断。以下是系统化的评估方法、测试指标和具体实现方案: 一、提示词优秀的核心标准 优秀的提示词应显著提升以下指标: 维度量化指标测试方法事实一致性Faithfulness …...

【leetcode hot 100 763】划分字母区间

解法一&#xff1a;用map记录<字母&#xff0c;字母出现的次数>&#xff0c;循环取出value-1&#xff0c;每次判断已经取出的字母&#xff08;Set记录&#xff09;是否还在后面存在&#xff08;value>1&#xff09;&#xff0c;若存在继续循环&#xff0c;若不存在开启…...

PCB工艺:现代电子产品的核心制造技术

引言 PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;是电子设备的核心组成部分&#xff0c;几乎所有现代电子产品&#xff0c;从智能手机到航天设备&#xff0c;都依赖于PCB实现电路连接。PCB制造工艺的进步直接影响电子产品的性能、可靠性和成本。…...

【UE5 C++课程系列笔记】34——结构体与Json的相互转化

目录 准备工作 一、结构体转Json 二、Json转结构体 三、复杂结构体与Json的转换 主要通过借助FJsonObjectConverter类实现结构体和 JSON 之间的相互转换。 准备工作 首先新建一个结构体如下 添加两个方法分别用于将Struct转为Json、Json转为Struct 一、结构体转Json FStri…...

2025最新系统 Git 教程(二)

第2章 Git基础 2.1 Git 基础 - 获取 Git 仓库 如果你只想通过阅读一章来学习 Git&#xff0c;那么本章将是你的不二选择。 本章涵盖了你在使用 Git 完成各种工作时将会用到的各种基本命令。 在学习完本章之后&#xff0c;你应该能够配置并初始化一个仓库&#xff08;reposito…...

力扣hot100_动态规划

动态规划 hot100_198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。…...

玄机-第六章-哥斯拉4.0流量分析的测试报告

目录 一、测试环境 二、测试目的 三、操作过程 Flag1 Flag2 Flag3 Flag4 Flag5 Flag6 Flag7 Flag8 Flag9 Flag10 Flag11 Flag12 Flag13 pam_unix.so关键代码 四、结论 一、测试环境 靶场介绍&#xff1a;国内厂商设置的玄机靶场&#xff0c;以应急响应题目著…...

【Hadoop入门】Hadoop生态圈概述:核心组件与应用场景概述

1 Hadoop生态圈概述 Hadoop生态圈是以 HDFS&#xff08;分布式存储&#xff09; 和 YARN&#xff08;资源调度&#xff09; 为核心&#xff0c;围绕大数据存储、计算、管理、分析等需求发展出的一系列开源工具集合。 核心特点&#xff1a; 模块化&#xff1a;各组件专注解决特定…...

深度学习实战电力设备缺陷检测

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对电力设备缺陷数据集进行训练和优化&#xff0c;该数据集包含丰富的电力设备缺…...

随机产生4位随机码(java)

Random类&#xff1a; 用于生成随机数 import java.util.Random; 导入必要的类 generateVerificationCode()方法&#xff1a; 这是一个静态方法&#xff0c;可以直接通过类名调用 返回一个6位数字的字符串&#xff0c;首位不为0 生成首位数字&#xff1a; random.nextInt…...