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

【UE5 C++课程系列笔记】35——HTTP基础——HTTP客户端异步请求API接口并解析响应的JSON

目录

前言

步骤

一、 搭建异步蓝图节点框架

二、异步蓝图节点嵌入到引擎的执行流程

三、获取本地时间并异步返回

四、获取网络时间并异步返回

五、源码


前言

本文以请求网络/本地时间API为例,介绍如何实现HTTP异步请求。

步骤

一、 搭建异步蓝图节点框架

1. 在“xxx.Build.cs”中添加“HTTP”模块 

2. 新建一个空白C++类

添加反射

按UE规范命名

让创建的C++类继承自 UBlueprintAsyncActionBase 类

添加元数据标签,替代默认执行引脚

定义一个枚举类型 ESampleNetTimeType,包含TaoBao 和 Local枚举值,分别代表淘宝时间和本地时间。

定义一个蓝图可调用的静态函数 SampleHttpTimeAsyncAction,该静态函数接受一个 UObject* 类型的世界上下文对象和一个 ESampleNetTimeType 枚举类型的参数,返回值是一个指向 USampleHttpTime 类对象的指针。

编译后可以看到此时蓝图节点 SampleHttpTimeAsyncAction,如下所示,该节点已经隐藏了默认的Then执行引脚

在添加自定义输出引脚之前,需要先申明一个动态多播。其中bResult表示请求是否成功;Message用于传递错误信息或者成功提示;RespInfo是一个结构体,用于传递网络时间响应的详细信息。

定义三个可在蓝图中赋值的动态多播委托:ThenOnSuccess 和 OnFail,分别用于在操作执行后、操作成功和操作失败时触发

此时运行可以看到蓝图节点 SampleHttpTimeAsyncAction,如下所示:

二、异步蓝图节点嵌入到引擎的执行流程

1. 定义成员变量:AsyncID 用于唯一标识异步操作,NetTimeType 用于存储网络时间类型,默认值为 ESampleNetTimeType::Local

构造函数传入初始化对象所需的各种信息

通过 Super(ObjectInitializer),将接收到的 FObjectInitializer 参数传递给基类的构造函数,以确保基类也能正确初始化

继续实现 SampleHttpTimeAsyncAction 静态函数,该函数创建一个 USampleHttpTime 对象,并设置其网络时间类型。RegisterWithGameInstance 函数用于将该异步操作对象注册到游戏实例中,确保其生命周期与游戏实例同步

在创建USampleHttpTime 对象后,“UBlueprintAsyncActionBase”类的“Activate”方法将被调用。接下来重写“UBlueprintAsyncActionBase”类的“Activate”方法

先调用父类的激活逻辑,然后在游戏线程上异步执行 Activate_Internal 方法,最后广播一个事件通知异步任务已经启动,需要等待完成。 

此时运行如下:

此时当异步任务执行完毕后,我们希望“SampleHttpTimeAsyncAction”的“On Success”/“On Fail”引脚执行输出,需要继续在“Activate_Internal”函数中补充异步任务内容。

三、获取本地时间并异步返回

        补充函数“Activate_Internal”实现如下,依据 NetTimeType 的值来确定是从网络获取时间,还是使用本地时间。若从网络获取时间,会设置相应的网络时间服务器 URL;若使用本地时间,则获取当前本地时间和 UTC 时间赋值给结构体“RespInfo”,并调用成功回调函数“CallOnSuccess”将“RespInfo”传递出去,最后释放资源。

函数“CallOnSuccess”、“CallOnFaild”、“RealeaseResources”定义和实现如下。其中:

        “CallOnSuccess”函数的作用是在操作成功时,将成功的相关信息(异步任务 ID、结果状态、消息和时间响应信息)广播给所有绑定到 OnSuccess 委托的函数。

        “CallOnFaild”函数的作用是在操作失败时,将失败的相关信息(异步任务 ID、结果状态、消息和时间响应信息)广播给所有绑定到 OnFail 委托的函数。

        “RealeaseResources”函数的作用是释放 USampleHttpTime 对象占用的资源,具体包括清除委托绑定和标记对象为可销毁状态。其中, Clear 方法会移除所有绑定到 Then 委托的函数,释放委托占用的资源; SetReadyToDestroy 方法,将 USampleHttpTime 对象标记为可销毁状态,引擎会在合适的时候销毁该对象,释放占用的内存和其他资源。

结构体“RespInfo”定义如下

选择本地时间

打印返回的北京时间和UTC时间

此时打印结果如下,可以看到成功打印时间信息

四、获取网络时间并异步返回

获取网络时间的api接口地址:https://acs.m.taobao.com/gw/mtop.common.getTimestamp/

响应信息如下:

{"api": "mtop.common.getTimestamp","v": "*","ret": ["SUCCESS::接口调用成功"],"data": {"t": "1744101991020"}
}

导入所需头文件

实现发送HTTP请求的函数如下,需要设置请求的 URL、请求方法、请求头和请求体内容,当 HTTP 请求完成后执行回调函数“OnHttpRespReceived”。

定义返回时间信息的结构体 

定义嵌套的结构体

实现接收HTTP响应的函数“OnHttpRespReceived”如下,如果请求和响应成功,就会解析响应中的 JSON 数据,提取时间戳并转换为 UTC 时间和北京时间,然后通过函数“CallOnSuccess”通知请求成功。

在蓝图中改使用网络api接口

此时运行就可以获取到网络返回的时间了

五、源码

SampleHttpTime.h

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"#include "Interfaces/IHttpRequest.h"
#include "HttpModule.h"
#include "Interfaces/IHttpResponse.h"#include "Kismet/BlueprintAsyncActionBase.h"#include "SampleHttpTime.generated.h"UENUM(BlueprintType)
enum class ESampleNetTimeType :uint8
{TaoBao UMETA(DisplayName = "TaobaoTimeAPI"),Local UMETA(DisplayName = "LocalTimeAPI"),MaxNum UMETA(Hidden)
};USTRUCT(BlueprintType)
struct STUDY_API FNetTimeRespDataInfo
{GENERATED_BODY()
public:UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")FString t = TEXT("");
};USTRUCT(BlueprintType)
struct STUDY_API FSampleNetTimeRespMessage
{GENERATED_BODY()
public:UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")FString api = TEXT("");UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")FString v = TEXT("");UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")TArray<FString> ret;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")FNetTimeRespDataInfo data;
};USTRUCT(BlueprintType)
struct STUDY_API FSampleNetTimeRespInfo
{GENERATED_BODY()
public:UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="NetTime")FDateTime BeijingDateTime = FDateTime();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")FDateTime UTCDateTime = FDateTime();UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")FSampleNetTimeRespMessage RespMessage;UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "NetTime")FString RawMessage = TEXT("");
};DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FSampleNetTimeDelegate, FGuid, AsyncID, bool, bResult, FString, Message, FSampleNetTimeRespInfo, RespInfo
);UCLASS(meta = (HideThen = true))  //隐藏默认的then引脚
class STUDY_API USampleHttpTime : public UBlueprintAsyncActionBase
{GENERATED_BODY()public:USampleHttpTime(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get());virtual ~USampleHttpTime();UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true",  //表明该函数主要用于蓝图内部使用,通常不希望在蓝图库中直接显示。WorldContext = "WorldContextObject", DisplayName = "SampleHttpTimeAsyncAction",   //指定函数在蓝图中的显示名称Keywords = "Sample Net Time"  //为函数添加搜索关键词,方便在蓝图中搜索该函数), Category = "Sample|NetTime")static USampleHttpTime* SampleHttpTimeAsyncAction(UObject* WorldContextObject, ESampleNetTimeType InNetTimeType);public:virtual void Activate() override;virtual void Activate_Internal();public:UPROPERTY(BlueprintAssignable)FSampleNetTimeDelegate Then;UPROPERTY(BlueprintAssignable)FSampleNetTimeDelegate OnSuccess;UPROPERTY(BlueprintAssignable)FSampleNetTimeDelegate OnFail;protected:void SendHttp(const FString& InServerURL);void OnHttpRespReceived(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded);void CallOnSuccess(FGuid InAsyncID, bool bInResult, FString InMessage, FSampleNetTimeRespInfo RespInfo);void CallOnFaild(FGuid InAsyncID, bool bInResult, FString InMessage, FSampleNetTimeRespInfo RespInfo);void RealeaseResources();protected:FGuid AsyncID = FGuid::NewGuid();ESampleNetTimeType NetTimeType = ESampleNetTimeType::Local;
};

SampleHttpTime.cpp

// Fill out your copyright notice in the Description page of Project Settings.#include "HttpTime/SampleHttpTime.h"#include "JsonObjectConverter.h"
#include "Async/Async.h"
#include "Async/TaskGraphInterfaces.h"USampleHttpTime::USampleHttpTime(const FObjectInitializer& ObjectInitializer) :Super(ObjectInitializer)
{
}USampleHttpTime::~USampleHttpTime()
{
}USampleHttpTime* USampleHttpTime::SampleHttpTimeAsyncAction(UObject* WorldContextObject, ESampleNetTimeType InNetTimeType)
{USampleHttpTime* AsyncAction = NewObject<USampleHttpTime>();AsyncAction->NetTimeType = InNetTimeType;AsyncAction->RegisterWithGameInstance(WorldContextObject);return AsyncAction;
}void USampleHttpTime::Activate()
{Super::Activate();AsyncTask(ENamedThreads::GameThread, [this]() {this->Activate_Internal();});FSampleNetTimeRespInfo RespInfo;Then.Broadcast(AsyncID, false, TEXT("USampleHttpTime is just started, please wait to be finished!"), RespInfo);}void USampleHttpTime::Activate_Internal()
{FString TimeServerURL = TEXT("");switch (NetTimeType){case ESampleNetTimeType::TaoBao:TimeServerURL = TEXT("https://acs.m.taobao.com/gw/mtop.common.getTimestamp/");break;case ESampleNetTimeType::Local:break;case ESampleNetTimeType::MaxNum:break;default:break;}if (!TimeServerURL.IsEmpty())  //如果TimeServerURL不是空字符串就使用网络时间,否则使用本地时间{SendHttp(TimeServerURL);return;}else{FSampleNetTimeRespInfo RespInfo;RespInfo.BeijingDateTime = FDateTime::Now();RespInfo.UTCDateTime = FDateTime::UtcNow();CallOnSuccess(AsyncID, true, TEXT("这是本地时间"), RespInfo);RealeaseResources();}
}void USampleHttpTime::SendHttp(const FString& InServerURL)
{FHttpRequestRef Request = FHttpModule::Get().CreateRequest();Request->OnProcessRequestComplete().BindUObject(this, &USampleHttpTime::OnHttpRespReceived);Request->SetURL(InServerURL);Request->SetVerb("Post");Request->SetHeader("Guid", AsyncID.ToString());Request->SetHeader("Content-Type", "application/json");Request->SetContentAsString(TEXT(""));Request->ProcessRequest();
}void USampleHttpTime::OnHttpRespReceived(FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSucceeded)
{FString BackAsyncID = HttpRequest->GetHeader(TEXT("Guid"));FSampleNetTimeRespInfo RespInfo;if (bSucceeded && HttpRequest->GetStatus() == EHttpRequestStatus::Succeeded && HttpResponse->GetResponseCode() == 200){FString ResponseJson = HttpResponse->GetContentAsString();FSampleNetTimeRespMessage RespMessage;bool bParseJson = FJsonObjectConverter::JsonObjectStringToUStruct(ResponseJson, &RespMessage);if (bParseJson){FString TickString = RespMessage.data.t;int64 TickTime = FCString::Atoi64(*TickString) / 1000;  //将时间戳字符串转换为 int64 类型,并将其转换为以秒为单位的时间戳RespInfo.UTCDateTime = FDateTime::FromUnixTimestamp(TickTime);  //将时间戳转换为 FDateTime 类型的 UTC 时间RespInfo.BeijingDateTime = FDateTime::FromUnixTimestamp(TickTime + 8 * 60 * 60);  //将时间戳转换为 FDateTime 类型的北京时间RespInfo.RawMessage = ResponseJson;RespInfo.RespMessage = RespMessage;CallOnSuccess(AsyncID, true, TEXT("Succeed!"), RespInfo);}}else{FString ErrorMessage = FString::Printf(TEXT("[%s],AsyncID:[%s],Receive NetTimeAsyncAction HttpResonpse Failed, Check Your Net"), *FString(__FUNCTION__), *(AsyncID.ToString()));UE_LOG(LogTemp, Error, TEXT("[%s]"), *ErrorMessage);CallOnFaild(AsyncID, false, ErrorMessage, RespInfo);}
}void USampleHttpTime::CallOnSuccess(FGuid InAsyncID, bool bInResult, FString InMessage, FSampleNetTimeRespInfo RespInfo)
{FSampleNetTimeDelegate TempDelegate = OnSuccess;AsyncTask(ENamedThreads::GameThread, [=]() {TempDelegate.Broadcast(InAsyncID, bInResult, InMessage, RespInfo);});
}void USampleHttpTime::CallOnFaild(FGuid InAsyncID, bool bInResult, FString InMessage, FSampleNetTimeRespInfo RespInfo)
{FSampleNetTimeDelegate TempDelegate = OnFail;AsyncTask(ENamedThreads::GameThread, [=]() {TempDelegate.Broadcast(InAsyncID, bInResult, InMessage, RespInfo);});
}void USampleHttpTime::RealeaseResources()
{Then.Clear();OnSuccess.Clear();OnFail.Clear();SetReadyToDestroy();
}

相关文章:

【UE5 C++课程系列笔记】35——HTTP基础——HTTP客户端异步请求API接口并解析响应的JSON

目录 前言 步骤 一、 搭建异步蓝图节点框架 二、异步蓝图节点嵌入到引擎的执行流程 三、获取本地时间并异步返回 四、获取网络时间并异步返回 五、源码 前言 本文以请求网络/本地时间API为例&#xff0c;介绍如何实现HTTP异步请求。 步骤 一、 搭建异步蓝图节点框架 …...

手机静态ip地址怎么获取?方法与解析‌

而在某些特定情境下&#xff0c;我们可能需要为手机设置一个静态IP地址。本文将详细介绍手机静态IP地址详解及获取方法 一、什么是静态IP地址&#xff1f; 静态IP&#xff1a;由用户手动设置的固定IP地址&#xff0c;不会因网络重启或设备重连而改变。 动态IP&#xff1a;由路…...

个人博客系统后端 - 注册登录功能实现指南

一、功能概述 个人博客系统的注册登录功能包括&#xff1a; 用户注册&#xff1a;新用户可以通过提供用户名、密码、邮箱等信息创建账号用户登录&#xff1a;已注册用户可以通过用户名和密码进行身份验证&#xff0c;获取JWT令牌身份验证&#xff1a;使用JWT令牌访问需要认证…...

Python 基础语法汇总

Python 语法 │ ├── 基本结构 │ ├── 语句&#xff08;Statements&#xff09; │ │ ├── 表达式语句&#xff08;如赋值、算术运算&#xff09; │ │ ├── 控制流语句&#xff08;if, for, while&#xff09; │ │ ├── 定义语句&#xff08;def…...

Linux上位机开发实践(OpenCV算法硬件加速)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理里面&#xff0c;opencv基本是一个标准模块。但是由于图像处理的特点&#xff0c;如果所有的算法都是cpu来做的话&#xff0c;效率会很低。…...

Spring Boot MongoDB自定义连接池配置

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;http://zhangxiaofan.blog.csdn.net/article/details/144341407 一、引言 在 Spring Boot 应用中使用 MongoDB 时&#xff0c;合理配置连接池可以显著提升数据库访问的性能和稳定性。默…...

Redis与Mysql双写一致性如何保证?

我们在面试的时候redis与mysql双写一致性是一个常考的问题&#xff0c;今天我们就一起探讨一下吧 所谓的一致性就是数据的一致性&#xff0c;在分布式系统中&#xff0c;可以理解为多个节点中数据的值是一致的。 强一致性&#xff1a; 这种一致性级别是最符合用户直觉的&…...

C#核心学习(十六)面向对象--关联知识点(2)string和Stringbuilder

引言 在C#开发中&#xff0c;字符串处理是日常编码的基础需求。然而string和StringBuilder的选择常常引发困惑——何时该用不可变的string&#xff1f;什么场景下必须选择可变的StringBuilder&#xff1f;本文将深入剖析两者的核心差异&#xff0c;并通过完整API对比给出实用建…...

游戏引擎学习第223天

回顾 今天我们正在进行过场动画序列的制作&#xff0c;因此我想深入探讨这个部分。昨天&#xff0c;我们暂时停止了过场动画的制作&#xff0c;距离最终结局还有一些内容没有完成。今天的目标是继续完成这些内容。 我们已经制作了一个过场动画的系列&#xff0c;并把它们集中…...

趣味编程之go与rust的爱恨情仇

声明:此篇文章利用deepseek生成。 第一章&#xff1a;出身之谜 Go&#xff08;江湖人称"高小戈"&#xff09;是名门之后——谷歌家的三少爷。生来就带着"简单粗暴"的家族基因&#xff0c;口号是**“少写代码多搬砖&#xff0c;并发处理赛神仙”**。它爹Ro…...

DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_基础功能示例(CalendarView01_01)📚…...

数据结构第五版【李春葆】

​ 数据结构教程上机实验指导第5版&#xff08;李春葆主编&#xff09;.pdf 数据结构教程&#xff08;第5版&#xff09;&#xff08;李春葆&#xff09;.pdf 数据结构教程&#xff08;第五版&#xff09;课后习题参考答案&#xff08;李春葆&#xff09;.pdf 数据结构教…...

LabVIEW配电器自动测试系统

随着航天技术的迅猛发展&#xff0c;航天器供配电系统的结构越来越复杂&#xff0c;对配电器的功能完整性、稳定性和可靠性提出了更高要求。传统人工测试方式难以满足高效率、高精度、可重复的测试需求。本项目开发了一套基于LabVIEW平台的宇航配电器自动测试系统&#xff0c;融…...

PhotoShop学习09

1.弯曲钢笔工具 PhotoShop提供了弯曲钢笔工具可以直观地创建路径&#xff0c;只需要对分段推拉就能够进行修改。弯曲港币工具位于工具面板中的钢笔工具里&#xff0c;它的快捷键为P。 在使用前&#xff0c;可以把填充和描边选为空颜色&#xff0c;并打开路径选项&#xff0c;勾…...

【C++】哈希unordered_map和set的使用以及哈希表,哈希桶的概念以及底层实现

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f310; C 语言 本文章完整代码在下篇文章开头给出 上篇文章&#xff1a;map和set使用红黑树封装的底层实现 下篇文章&#xff1a;封装…...

AOSP14 Launcher3——手势上滑关键类AbsSwipeHandler解析

我们来深入分析 quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java 这个非常核心且复杂的类。 1. 核心作用 (Core Role): AbsSwipeUpHandler 是 Quickstep (Launcher3 的手势导航实现) 中处理从屏幕底部上滑手势的核心逻辑抽象基类。它负责管理从手势开始到结束的…...

设计模式——建造者模式(生成器模式)总结

当我们需要创建一个非常复杂的对象时&#xff0c;可以使用建造者模式&#xff0c;分步骤建造一个对象&#xff0c;最后将完整的对象返回给客户端。 比如&#xff0c;我们要生成一个房子对象&#xff0c;建造一个房子&#xff0c;需要打地基、盖围墙、盖地板、安装门、安装窗户…...

Spring Boot(二十一):RedisTemplate的String和Hash类型操作

RedisTemplate和StringRedisTemplate的系列文章详见&#xff1a; Spring Boot&#xff08;十七&#xff09;&#xff1a;集成和使用Redis Spring Boot&#xff08;十八&#xff09;&#xff1a;RedisTemplate和StringRedisTemplate Spring Boot&#xff08;十九&#xff09;…...

使用Python爬虫的2大原因和6大常用库

爬虫其实就是请求http、解析网页、存储数据的过程&#xff0c;并非高深的技术&#xff0c;但凡是编程语言都能做&#xff0c;连Excel VBA都可以实现爬虫&#xff0c;但Python爬虫的使用频率最高、场景最广。 这可不仅仅是因为Python有众多爬虫和数据处理库&#xff0c;还有一个…...

Java 架构设计:从单体架构到微服务的转型之路

Java 架构设计&#xff1a;从单体架构到微服务的转型之路 在现代软件开发中&#xff0c;架构设计的选择对系统的可扩展性、可维护性和性能有着深远的影响。随着业务需求的日益复杂和用户规模的不断增长&#xff0c;传统的单体架构逐渐暴露出其局限性&#xff0c;而微服务架构作…...

C# 混淆代码工具--ConfuserEx功能与使用指南

目录 1 前言1.1 可能带来的问题 2 ConfuserEx2.1 简介2.2 功能特点2.3 基本使用方法2.4 集成到MSBuild2.5 深入设置2.5.1 保护机制2.5.1.1 ConfuserEx Protection 2.5.2 精细的代码保护主要特性1. decl-type(string)2.full-name(string)3. is-public()4. match(string)5. match…...

使用PyTorch实现目标检测边界框转换与可视化

一、引言 在目标检测任务中&#xff0c;边界框&#xff08;Bounding Box&#xff09;的坐标表示与转换是核心基础操作。本文将演示如何&#xff1a; 实现边界框的两种表示形式&#xff08;角点坐标 vs 中心坐标&#xff09;之间的转换 使用Matplotlib在图像上可视化边界框 验…...

nlp面试重点

深度学习基本原理&#xff1a;梯度下降公式&#xff0c;将损失函数越来越小&#xff0c;最终预测值和实际值误差比较小。 交叉熵&#xff1a;-p(x)logq(x)&#xff0c;p(x)是one-hot形式。如果不使用softmax计算交叉熵&#xff0c;是不行的。损失函数可能会非常大&#xff0c;…...

欢乐力扣:反转链表二

文章目录 1、题目描述2、思路 1、题目描述 反转链表二。  给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 2、思路 参考官方题解&#xff0c;基本思路…...

2025最新系统 Git 教程(七)(完结)

第4章 分布式Git 4.1 分布式 Git - 分布式工作流程 你现在拥有了一个远程 Git 版本库&#xff0c;能为所有开发者共享代码提供服务&#xff0c;在一个本地工作流程下&#xff0c;你也已经熟悉了基本 Git 命令。你现在可以学习如何利用 Git 提供的一些分布式工作流程了。 这一…...

14-大模型微调和训练之-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))

1. datasets 库核心方法 1.1. 列出数据集 使用 datasets 库&#xff0c;你可以轻松列出所有 Hugging Face 平台上的数据集&#xff1a; from datasets import list_datasets # 列出所有数据集 all_datasets list_datasets() print(all_datasets)1.2. 加载数据集 你可以通过…...

聊透多线程编程-线程基础-4.C# Thread 子线程执行完成后通知主线程执行特定动作

在多线程编程中&#xff0c;线程之间的同步和通信是一个常见的需求。例如&#xff0c;我们可能需要一个子线程完成某些任务后通知主线程&#xff0c;并由主线程执行特定的动作。本文将基于一个示例程序&#xff0c;详细讲解如何使用 AutoResetEvent 来实现这种场景。 示例代码…...

论文阅读笔记——Reactive Diffusion Policy

RDP 论文 通过 AR 提供实时触觉/力反馈&#xff1b;慢速扩散策略&#xff0c;用于预测低频潜在空间中的高层动作分块&#xff1b;快速非对称分词器实现闭环反馈控制。 ACT、 π 0 \pi_0 π0​ 采取了动作分块&#xff0c;在动作分块执行期间处于开环状态&#xff0c;无法及时响…...

ISIS协议(动态路由协议)

ISIS基础 基本概念 IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP&#xff08;ConnectionL…...

大数据(7.1)Kafka实时数据采集与分发的企业级实践:从架构设计到性能调优

目录 一、实时数据洪流下的技术突围1.1 行业需求演进曲线1.2 传统方案的技术瓶颈 二、Kafka实时架构设计精要2.1 生产者核心参数矩阵2.1.1 分区策略选择指南 2.2 消费者组智能负载均衡 三、实时数据管道实战案例3.1 电商大促实时看板3.2 工业物联网预测性维护 四、生产环境性能…...