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

【中间件】bthread_基础_TaskControl

TaskControl

  • 1 Definition
  • 2 Introduce
      • **核心职责**
  • 3 成员解析
    • **3.1 数据结构与线程管理**
    • **3.2 任务调度与负载均衡**
    • **3.3 线程停放与唤醒(ParkingLot)**
    • **3.4 统计与监控**
  • 4 **工作流程**
  • 5 **设计亮点**
  • 6 **使用场景示例**
  • 7 **总结**
  • 8 学习过程中的疑问
    • 8.1 init函数为什么不在构造函数中调用

1 Definition

class TaskControl {friend class TaskGroup; // 友元类friend void wait_for_butex(void*); // 友元函数
#ifdef BRPC_BTHREAD_TRACERfriend bthread_t init_for_pthread_stack_trace(); // 友元函数
#endif // BRPC_BTHREAD_TRACERpublic:TaskControl();~TaskControl();// Must be called before using. `nconcurrency' is # of worker pthreads.int init(int nconcurrency);// Create a TaskGroup in this control.TaskGroup* create_group(bthread_tag_t tag);// Steal a task from a "random" group.bool steal_task(bthread_t* tid, size_t* seed, size_t offset);// Tell other groups that `n' tasks was just added to caller's runqueuevoid signal_task(int num_task, bthread_tag_t tag);// Stop and join worker threads in TaskControl.void stop_and_join();// Get # of worker threads.int concurrency() const { return _concurrency.load(butil::memory_order_acquire); }int concurrency(bthread_tag_t tag) const { return _tagged_ngroup[tag].load(butil::memory_order_acquire); }void print_rq_sizes(std::ostream& os);double get_cumulated_worker_time();double get_cumulated_worker_time_with_tag(bthread_tag_t tag);int64_t get_cumulated_switch_count();int64_t get_cumulated_signal_count();// [Not thread safe] Add more worker threads.// Return the number of workers actually added, which may be less than |num|int add_workers(int num, bthread_tag_t tag);// Choose one TaskGroup (randomly right now).// If this method is called after init(), it never returns NULL.TaskGroup* choose_one_group(bthread_tag_t tag);#ifdef BRPC_BTHREAD_TRACER// A stacktrace of bthread can be helpful in debugging.void stack_trace(std::ostream& os, bthread_t tid);std::string stack_trace(bthread_t tid);
#endif // BRPC_BTHREAD_TRACERprivate:typedef std::array<TaskGroup*, BTHREAD_MAX_CONCURRENCY> TaggedGroups;static const int PARKING_LOT_NUM = 4;typedef std::array<ParkingLot, PARKING_LOT_NUM> TaggedParkingLot;// Add/Remove a TaskGroup.// Returns 0 on success, -1 otherwise.int _add_group(TaskGroup*, bthread_tag_t tag);int _destroy_group(TaskGroup*);// Tag groupTaggedGroups& tag_group(bthread_tag_t tag) { return _tagged_groups[tag]; }// Tag ngroupbutil::atomic<size_t>& tag_ngroup(int tag) { return _tagged_ngroup[tag]; }// Tag parking slotTaggedParkingLot& tag_pl(bthread_tag_t tag) { return _pl[tag]; }static void delete_task_group(void* arg);static void* worker_thread(void* task_control);template <typename F>void for_each_task_group(F const& f);bvar::LatencyRecorder& exposed_pending_time();bvar::LatencyRecorder* create_exposed_pending_time();bvar::Adder<int64_t>& tag_nworkers(bthread_tag_t tag);bvar::Adder<int64_t>& tag_nbthreads(bthread_tag_t tag);std::vector<butil::atomic<size_t>> _tagged_ngroup;std::vector<TaggedGroups> _tagged_groups;butil::Mutex _modify_group_mutex;butil::atomic<bool> _init;  // if not init, bvar will case coredumpbool _stop;butil::atomic<int> _concurrency;std::vector<pthread_t> _workers;butil::atomic<int> _next_worker_id;bvar::Adder<int64_t> _nworkers;butil::Mutex _pending_time_mutex;butil::atomic<bvar::LatencyRecorder*> _pending_time;bvar::PassiveStatus<double> _cumulated_worker_time;bvar::PerSecond<bvar::PassiveStatus<double> > _worker_usage_second;bvar::PassiveStatus<int64_t> _cumulated_switch_count;bvar::PerSecond<bvar::PassiveStatus<int64_t> > _switch_per_second;bvar::PassiveStatus<int64_t> _cumulated_signal_count;bvar::PerSecond<bvar::PassiveStatus<int64_t> > _signal_per_second;bvar::PassiveStatus<std::string> _status;bvar::Adder<int64_t> _nbthreads;std::vector<bvar::Adder<int64_t>*> _tagged_nworkers;std::vector<bvar::PassiveStatus<double>*> _tagged_cumulated_worker_time;std::vector<bvar::PerSecond<bvar::PassiveStatus<double>>*> _tagged_worker_usage_second;std::vector<bvar::Adder<int64_t>*> _tagged_nbthreads;std::vector<TaggedParkingLot> _pl;#ifdef BRPC_BTHREAD_TRACERTaskTracer _task_tracer;
#endif // BRPC_BTHREAD_TRACER};

2 Introduce

TaskControl作为任务调度控制中心,管理多个任务组(TaskGroup)并协调工作线程的高效运作,适用于BRPC的bthread协程库:

核心职责

  1. 任务组管理:创建、销毁任务组,支持按标签(bthread_tag_t)分类管理。
  2. 线程池调度:动态调整工作线程数量,实现任务窃取(Work Stealing)以平衡负载。
  3. 同步与唤醒:通过停放区(ParkingLot)管理线程的休眠与唤醒。
  4. 性能监控:集成统计模块(bvar)跟踪任务处理时间、切换次数等指标。

3 成员解析

3.1 数据结构与线程管理

  • _tagged_groups
    类型:std::vector<TaggedGroups>
    作用:按标签存储任务组指针数组,每个标签对应一个TaggedGroups(固定大小为BTHREAD_MAX_CONCURRENCY的数组)。
    示例:标签可用于区分不同业务优先级或租户的任务。

  • _tagged_ngroup
    类型:std::vector<butil::atomic<size_t>>
    作用:记录每个标签下的任务组数量,原子操作保证线程安全。

  • _workers
    类型:std::vector<pthread_t>
    作用:保存所有工作线程的ID,用于线程生命周期管理(启动、停止、回收)。

  • _concurrency
    类型:butil::atomic<int>
    作用:总工作线程数,支持原子读写,动态调整并发度。

3.2 任务调度与负载均衡

  • steal_task(bthread_t* tid, size_t* seed, size_t offset)
    作用:从其他任务组窃取任务,避免工作线程空闲。
    实现:

    • 使用seed随机选择目标组,结合offset避免多个线程竞争同一队列。
    • 窃取成功返回true,任务ID存入tid
  • signal_task(int num_task, bthread_tag_t tag)
    作用:通知任务组有新任务加入,触发唤醒机制。
    场景:当任务被添加到队列时,调用此方法唤醒可能休眠的线程。

  • choose_one_group(bthread_tag_t tag)
    作用:根据标签选择一个任务组,用于任务分发或负载均衡。
    策略:可能采用轮询或随机算法选择组,确保任务均匀分配。

3.3 线程停放与唤醒(ParkingLot)

  • _pl
    类型:std::vector<TaggedParkingLot>
    作用:按标签管理的停放区数组,每个标签对应PARKING_LOT_NUM个停放区。
    机制:
    • 工作线程无任务时进入停放区等待,减少CPU空转。
    • 新任务到达时,通过停放区唤醒线程,降低延迟。

3.4 统计与监控

  • bvar集成
    关键指标:

    • _cumulated_worker_time:累计任务处理时间。
    • _cumulated_switch_count:上下文切换次数。
    • _signal_per_second:每秒任务唤醒次数。
      作用:通过BRPC的bvar库暴露性能指标,方便实时监控与调优。
  • 标签化统计
    成员如_tagged_nworkers_tagged_cumulated_worker_time等,按标签细分统计,支持多维分析。

4 工作流程

  1. 初始化

    • 调用init(nconcurrency)创建指定数量工作线程,每个线程执行worker_thread函数。
    • 工作线程通过choose_one_group选择任务组,执行任务循环。
  2. 任务执行

    • 线程从本地任务组获取任务,若队列为空,尝试从其他组窃取(steal_task)。
    • 无任务可执行时,进入停放区(ParkingLot)休眠。
  3. 任务通知

    • 添加新任务时,调用signal_task递增信号计数器,唤醒停放区线程。
  4. 动态扩缩容

    • add_workers动态增加指定标签的工作线程,适应负载变化。
  5. 停止与清理

    • stop_and_join设置_stop标志,通知所有线程退出,并回收资源。

5 设计亮点

  • 标签化分组
    支持多维度任务分类,适用于混合部署场景(如不同服务优先级)。
  • 任务窃取
    避免工作线程闲置,提升CPU利用率,降低任务处理延迟。
  • 高效同步
    结合原子操作与停放区,减少锁竞争,保证高吞吐量。
  • 精细化监控
    通过bvar提供详尽的运行时指标,助力性能分析与优化。

6 使用场景示例

高并发服务

  • Web服务器接收请求后,封装为bthread任务,按业务类型打标签。
  • TaskControl根据标签分发任务到不同组,保证关键业务优先调度。
  • 工作线程动态扩展应对流量高峰,空闲时自动缩减节省资源。
  • 监控指标实时反馈系统负载,辅助容量规划。

7 总结

TaskControl是BRPC bthread调度系统的核心,通过高效的任务组管理、工作线程调度及细粒度监控,实现了高并发、低延迟的协程任务处理。其设计充分考虑了扩展性、性能与可观测性,是构建高性能C++服务的基石组件。

8 学习过程中的疑问

8.1 init函数为什么不在构造函数中调用

疑问:init函数在注释中声明需要在使用前调用,为什么不能将其放在构造函数中直接调用呢?
回答:

  • 可能原因:

      1. 初始化可能失败,需要错误处理
      • 构造函数没有返回值,若在构造函数中执行可能的失败操作(eg. 创建线程、分配资源),只能通过异常或设置内部状态标记错误。brpc代码风格倾向于避免异常,习惯于返回错误码。参考代码8-1
      1. 需要依赖外部参数
      • 构造时参数可能不完整,TaskControl的初始化需要并发线程数等参数,可能在运行时动态确定,无法在编译器硬编码。
      • 更复杂的重载,如果后续需要扩展初始化参数(eg. 增加timeout/policy等配置),显式init()更容易扩展,而构造函数重载会膨胀。
    • 3 支持对象的复用
      • 销毁后重新初始化,某些场景下,用户可能希望销毁TaskControl后重新初始化(eg. 动态调整线程池的大小)。若初始化逻辑在构造函数中,则需要先析构对象再重新构造,而显式init/stop_and_join允许复用同一对象。参考代码8-2
    • 4 明确的二段式生命周期
      • 分离资源分配与初始化,二段式设计(构造+init())将对喜爱嗯的内存分配和资源初始化解耦:
        • 构造阶段:仅进行内存布局、简单成员初始化;
        • 初始化阶段:执行重量级操作(eg. 创建线程、连接资源);
      • 更符合RAII的变体模式,尤其是在需要延迟初始化时。
    • 5 避免隐藏的副作用
      • 隐式初始化可能引入意外行为,若构造函数自动初始化,用户可能在不知情的情况下触发资源分配(eg. 线程创建)。显式init()强制用户主动控制初始化时机,避免副作用。
    • 6 与brpc其他组件的设计一致性
      • 统一风格,brpc很多组件(eg. Channel / Server)均采用类似的二段式模式(先构造,再调用init() / start()),保持代码风格统一,降低用户学习成本。
  • 什么情况下应在构造函数中初始化?

    • 轻量级且无失败可能的操作,eg. 设置默认参数、初始化原子计数器等。
    • 强制一次性初始化,若对象必须在构造时完全初始化,且不允许重新初始化。
  • 两种方式对比,见代码8-3

  • 二段式的作用

    • 清晰的错误处理:通过返回int明确传递错误
    • 参数灵活性:允许运行时动态决定初始化参数
    • 对象复用:支持重新初始化而不重新构造
    • 代码一致性:符合BRPC设计惯例

代码8-1:

// 当前使用方法
TaskControl ctl;
if (ctl.init(32) != 0) {// 处理初始化失败
}// 如果放在构造函数中
TaskControl ctl(32);
if (!ctl.is_initialized()) {// 处理错误
}

代码8-2

TaskControl ctl;
ctl.init(16);
ctl.stop_and_join();
ctl.init(32);

代码8-3

// 二段式
class TaskControl {
public:TaskControl();  // 轻量构造~TaskControl();int init(int nconcurrency);  // 显式初始化// ...
};// 使用方式
TaskControl ctl;
if (ctl.init(32) != 0) {LOG(ERROR) << "Failed to initialize TaskControl";return -1;
}// 合并到构造方式
class TaskControl {
public:explicit TaskControl(int nconcurrency);  // 可能抛出异常~TaskControl();bool is_initialized() const;  // 需额外状态检查// ...
};// 使用方式
try {TaskControl ctl(32);
} catch (const std::exception& e) {LOG(ERROR) << "Construction failed: " << e.what();
}
if (!ctl.is_initialized()) {  // 需要额外检查// 处理错误
}

相关文章:

【中间件】bthread_基础_TaskControl

TaskControl 1 Definition2 Introduce**核心职责** 3 成员解析**3.1 数据结构与线程管理****3.2 任务调度与负载均衡****3.3 线程停放与唤醒&#xff08;ParkingLot&#xff09;****3.4 统计与监控** 4 **工作流程**5 **设计亮点**6 **使用场景示例**7 **总结**8 学习过程中的疑…...

systemd和OpenSSH

1 systemd 1.1 配置文件 /etc/systemd/system /lib/systemd/system /run/systemd/system /usr/lib/systemd/user 1.2 commands systemctl list-unit-files | grep enable systemctl cat dlt-daemon.service systemctl cat dlt-system.service systemctl show dlt-daemon.ser…...

08 Python集合:数据 “去重神器” 和运算魔法

文章目录 一、Python 中的集合概述1. 集合的特性 二、集合的创建三、元素的遍历四、集合的运算1. 成员运算2. 二元运算3. 比较运算 五、集合的方法六、不可变集合 一、Python 中的集合概述 在 Python 里&#xff0c;集合&#xff08;Set&#xff09;是一种无序且元素唯一的数据…...

配置和使用基本存储

配置和使用基本存储 文章目录 配置和使用基本存储[toc]一、什么是卷&#xff1f;二、卷的类型三、使用EmptyDir卷存储数据1.了解EmptyDir卷2.测试EmptyDir卷的使用 四、使用HostPath卷挂载宿主机文件1.了解HostPath卷2.测试HostPath卷的使用 五、使用NFS卷挂载NFS共享目录1.准备…...

win11 终端 安装ffmpeg 使用终端Scoop

1、安装scoop (Windows 包管理器) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser iwr -useb get.scoop.sh | iex 2、使用scoop来安装ffmpeg scoop install ffmpeg 3、测试一下ffmpeg&#xff0c;将Mp3文件转为Wav文件 ffmpeg -i A.mp3 A.wav 然后我们就看到A.wav生成…...

navicat中导出数据表结构并在word更改为三线表(适用于navicat导不出doc)

SELECTCOLUMN_NAME 列名,COLUMN_TYPE 数据类型,DATA_TYPE 字段类型,IS_NULLABLE 是否为空,COLUMN_DEFAULT 默认值,COLUMN_COMMENT 备注 FROMINFORMATION_SCHEMA.COLUMNS WHEREtable_schema db_animal&#xff08;数据库名&#xff09; AND table_name activity&#xff08;…...

Azure Monitor 实战指南:全方位监控应用与基础设施

Azure Monitor 是 Azure 云原生的统一监控解决方案,能够实时追踪应用性能、基础设施健康状态及日志数据。本文将通过 实战步骤 演示如何利用 Azure Monitor 监控 GPT-4 服务、虚拟机、存储等资源,并结合自动化告警和日志分析,构建企业级监控体系。 1. Azure Monitor 核心功能…...

【人工智能】释放本地AI潜能:LM Studio用户脚本自动化DeepSeek的实战指南

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大型语言模型(LLM)的快速发展,DeepSeek以其高效的性能和开源特性成为开发者关注的焦点。LM Studio作为一款强大的本地AI模型管理工具…...

智能体-CyberTask Orchestrator设计概要(V4.1超长版)

智能体-CyberTask Orchestrator设计概要&#xff08;V4.0超长版&#xff09; 一、深度演进背景与战略定位&#xff08;核心篇幅拓展至2187字&#xff09; &#xff08;本段新增行业趋势与技术必要性论证&#xff09; 1.1 全球网络安全威胁态势分析&#xff08;2023-2025&…...

C# 面向对象实例演示

C# 面向对象编程实例演示 一、基础概念回顾 面向对象编程(OOP)的四大基本特性&#xff1a; ​​封装​​ - 将数据和操作数据的方法绑定在一起​​继承​​ - 创建新类时重用现有类的属性和方法​​多态​​ - 同一操作作用于不同对象产生不同结果​​抽象​​ - 简化复杂系…...

软件产品测试报告:如何全面评估及保障软件质量?

软件产品测试报告可以对软件产品质量做全面评估&#xff0c;还能够把评估结果展示出来&#xff0c;它依靠一系列测试手段和数据分析&#xff0c;能为产品的完善以及决策提供重要依据。下面从不同方面展开说明。 测试目的 开展本次软件产品测试&#xff0c;主要目的有三个。一…...

leetcode42-接雨水

leetcode 42 思路 本题使用 单调栈 来计算每个位置能够接住的雨水量 理解问题 题目要求计算一系列柱子之间可以接住的雨水量。输入是一个数组&#xff0c;每个元素代表柱子的高度。输出是一个整数&#xff0c;表示能够接住的水量。 找到边界条件 什么情况下可以接住雨水…...

普通IT的股票交易成长史--20250430晚

声明&#xff1a;本文章的内容只是自己学习的总结&#xff0c;不构成投资建议。文中观点基本来自yt站Andylee&#xff0c;美股Alpha姐&#xff0c;综合自己的观点得出。感谢他们的无私分享。 送给自己的话&#xff1a; 仓位就是生命&#xff0c;绝对不能满仓&#xff01;&…...

Elastic Security 8.18 和 9.0 中的新功能

作者&#xff1a;来自 Elastic Mark Settle, Tamarian Del Conte, James Spiteri, Tinsae Erkailo, Charles Davison, Raquel Tabuyo, Kseniia Ignatovych, Paul Ewing, Smriti 检测规则的自动迁移、用于 ES|QL 的 Lookup Join、AI 功能增强&#xff0c;以及更多功能。 Elasti…...

使用 Vue 开发 VS Code 插件前端页面(上)

本文的方案主要参考了这篇博客&#xff1a; Vscode 的 extension webview 开发示例&#xff1a; Vue 和 React 实现 https://juejin.cn/post/7325132202970136585样例项目地址&#xff1a; github | vscode-webview-with-vuehttps://github.com/HiMeditator/vscode-webview-w…...

Vue Router路由原理

Vue Router 是 Vue.js 官方的路由管理器&#xff0c;它与 Vue.js 核心深度集成&#xff0c;使得构建单页应用&#xff08;SPA&#xff09;变得非常容易。Vue Router 的主要功能包括动态路由匹配、嵌套路由、编程式导航、命名路由、路由守卫等 Vue Router 原理 单页应用&#x…...

Tauri v1 与 v2 配置对比

本文档对比 Tauri v1 和 v2 版本的配置结构和内容差异&#xff0c;帮助开发者了解版本变更并进行迁移。 配置结构变化 v1 配置结构 {"package": { ... },"tauri": { "allowlist": { ... },"bundle": { ... },"security":…...

详解 MyBatis-Plus 框架中 QueryWrapper 类

QueryWrapper 一、 QueryWrapper 的概念为什么需要 QueryWrapper&#xff1f; 二、 QueryWrapper 的基本使用1. 创建 QueryWrapper 实例2. 添加查询条件3. 执行查询 三、 QueryWrapper 的常见方法1. 基本条件方法1.1 eq - 等于1.2 ne - 不等于1.3 gt - 大于1.4 ge - 大于等于1.…...

小米MiMo-7B大模型:解锁推理潜力的新传奇!

在大语言模型&#xff08;LLMs&#xff09;蓬勃发展的时代&#xff0c;推理能力成为衡量模型优劣的关键指标。今天为大家解读的这篇论文&#xff0c;介绍了小米的MiMo-7B模型&#xff0c;它通过独特的预训练和后训练优化&#xff0c;展现出强大的推理实力&#xff0c;快来一探究…...

联邦学习的收敛性分析(全设备参与,不同本地训练轮次)

联邦学习的收敛性分析 在联邦学习中,我们的目标是分析全局模型的收敛性,考虑设备异构性(不同用户的本地训练轮次不同)和数据异质性(用户数据分布不均匀)。以下推导从全局模型更新开始,逐步引入假设并推导期望损失的递减关系,最终给出收敛性结论。 1. 全局模型更新与泰…...

硬件工程师面试常见问题(10)

第四十六问&#xff1a;锁存器&#xff0c;触发器&#xff0c;寄存器三者的区别 触发器&#xff1a;能够存储一位二值信号的基本单元电路统称为 "触发器"。&#xff08;单位&#xff09; 锁存器&#xff1a;一位触发器只能传送或存储一位数据&#xff0c;而在实际工…...

1295. 统计位数为偶数的数字

题目 解法一 遍历数组挨个判断元素位数并统计&#xff08;我的第一想法&#xff09; class Solution { public:int findNumbers(vector<int>& nums) {int result 0;for(int n: nums){if(judge(n)) result;}return result;}bool judge(int a){int sum 1;a a / 10…...

3.1/Q1,Charls最新文章解读

文章题目&#xff1a;Social participation patterns and associations with subsequent cognitive function in older adults with cognitive impairment: a latent class analysis DOI&#xff1a;10.3389/fmed.2025.1493359 中文标题&#xff1a;认知障碍老年人的社会参与模…...

楼宇智能化四章【期末复习】

四、火灾自动报警系统 结构组成:火灾探测器、区域报警器、集中报警器 形式:1. 多线制系统 2.总线制系统 3.集中智能系统 4.分布智能系统 5.网络通信系统 工作原理: 以下是关于火灾自动报警系统及相关灭火系统的详细解答: 1. 火灾自动报警系统有哪几种形式? 区…...

Splunk 使用Role 实现数据隔离

很多人知道 Splunk 有很多自带的Role, 今天我就要说说定制化的Role: 1: 在创建新role 的界面: 2: 在如下的界面,可以定制allow index name: 3: 创建好新Role 后,在SAML 添加新的group 的时候,就可以看到Role 给某个group: 4: 这样一个特定组的人来申请Splunk 权限,就可…...

Learning vtkjs之ImplicitBoolean

隐式函数布尔操作 介绍 vtkImplicitBoolean 允许对隐式函数&#xff08;如平面、球体、圆柱体和盒子&#xff09;进行布尔组合。操作包括并集、交集和差集。可以指定多个隐式函数&#xff08;所有函数都使用相同的操作进行组合&#xff09;。 支持的操作&#xff1a;‘UNION…...

LabelVision - yolo可视化标注工具

LabelVision是一款可视化图像标注工具,主要用于计算机视觉研究中的各种标注任务。 支持多边形、矩形、圆形等多种标注方式&#xff0c;并且可以输出JSON、COCO等多种数据格式&#xff0c;方便与其他软件和框架进行集成和互操作。 ‌ 通过它可以很轻易的对图像进行标注,适合Y…...

系统分析师-第十五章

学习目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&#xff0c;训练快速阅读能力、掌握三遍读书法、运用番茄工作法。 2.从底层逻辑角度理解知识点&#xff0c;避免死记硬背。 3.通过考试验证学习效果。 学习阶段 快速阅读 …...

大连理工大学选修课——机器学习笔记(3):KNN原理及应用

KNN原理及应用 机器学习方法的分类 基于概率统计的方法 K-近邻&#xff08;KNN&#xff09;贝叶斯模型最小均值距离最大熵模型条件随机场&#xff08;CRF&#xff09;隐马尔可夫模型&#xff08;HMM&#xff09; 基于判别式的方法 决策树&#xff08;DT&#xff09;感知机…...

09 Python字典揭秘:数据的高效存储

文章目录 一.字典是什么1.字典的特点 二.字典的创建和使用三.字典的操作1.访问元素2.修改元素3.删除元素4.遍历字典5.成员运算 四.字典方法1.获取字典中的指定元素2.获取字典中的元素3.字典合并4.删除元素 一.字典是什么 在 Python 中&#xff0c;字典&#xff08;dict&#x…...

20250430在ubuntu14.04.6系统上完成编译NanoPi NEO开发板的FriendlyCore系统【严重不推荐,属于没苦硬吃】

【开始编译SDK之前需要更新源】 rootrootubuntu:~/friendlywrt-h3$ sudo apt update 【这两个目录你在ubuntu14.04.6系统上貌似git clone异常了】 Y:\friendlywrt-h3\out\wireguard Y:\friendlywrt-h3\kernel\exfat-nofuse 【需要单线程编译文件系统&#xff0c;原因不明】 Y:…...

第五部分:进阶项目实战

在前面的学习中&#xff0c;我们已经掌握了图像和视频的基础操作、增强滤波、特征提取以及一些基础的目标检测方法。现在&#xff0c;我们将综合运用这些知识来构建一些更复杂、更实用的应用项目。 这一部分的项目将结合前面学到的技术&#xff0c;并介绍一些新的概念和工具&a…...

【Linux】记录一个有用PS1

PS1 是用来定义shell提示符的环境变量 下面是一个带有颜色和丰富信息的 Linux PS1 配置示例&#xff0c;包含用户名、主机名、路径、时间、Git 分支和退出状态提示&#xff1a; # 添加到 ~/.bashrc 文件末尾 PS1\[\e[1;32m\]\u\[\e[m\] # 绿色粗体用户名 PS…...

【SpringBoot】基于mybatisPlus的博客管理系统(2)

目录 1.实现用户登录 Jwt令牌 1.引入依赖 2.生成令牌&#xff08;token&#xff09; Controller Service Mapper 2.实现强制登录 定义拦截器&#xff1a; 配置拦截器&#xff1a; 1.实现用户登录 在之前的项目登录中&#xff0c;我使用的是Session传递用户信息实现校验…...

免费在Colab运行Qwen3-0.6B——轻量高性能实战

Qwen一直在默默地接连推出新模型。 每个模型都配备了如此强大的功能和高度量化的规模,让人无法忽视。 继今年的QvQ、Qwen2.5-VL和Qwen2.5-Omni之后,Qwen团队现在发布了他们最新的模型系列——Qwen3。 这次他们不是发布一个而是发布了八个不同的模型——参数范围从6亿到235…...

精益数据分析(35/26):SaaS商业模式关键指标解析

精益数据分析&#xff08;35/26&#xff09;&#xff1a;SaaS商业模式关键指标解析 在创业与数据分析的征程中&#xff0c;我们持续探索不同商业模式的运营奥秘。今天&#xff0c;我们带着共同进步的期望&#xff0c;深入研读《精益数据分析》&#xff0c;聚焦SaaS商业模式&am…...

【论文速读】《Scaling Scaling Laws with Board Games》

论文链接&#xff1a;https://arxiv.org/pdf/2104.03113 《Scaling Scaling Laws with Board Games》&#xff1a;探索棋盘游戏中的扩展规律 摘要 如今&#xff0c;机器学习领域中规模最大的实验所需的资源&#xff0c;超出了仅有几家机构的预算。幸运的是&#xff0c;最近的…...

C++ 与多技术融合的深度实践:从 AI 到硬件的全栈协同

在数字化技术高速发展的今天&#xff0c;C 凭借其卓越的性能优势和底层控制能力&#xff0c;成为连接上层应用与底层硬件的核心纽带。这种独特定位使其在与 AI 深度学习、Python 生态及硬件加速技术的融合中展现出不可替代的价值&#xff0c;构建起从算法实现到硬件优化的全栈技…...

AdaBoost算法的原理及Python实现

一、概述 AdaBoost&#xff08;Adaptive Boosting&#xff0c;自适应提升&#xff09;是一种迭代式的集成学习算法&#xff0c;通过不断调整样本权重&#xff0c;提升弱学习器性能&#xff0c;最终集成为一个强学习器。它继承了 Boosting 的基本思想和关键机制&#xff0c;但在…...

无刷马达驱动芯片算法逐步革新着风扇灯行业--其利天下

风扇灯市场热度持续攀升&#xff0c;根据行业数据&#xff0c;风扇灯市场规模从2010年的100亿元增长至2019年的200亿元&#xff0c;年均复合增长率超10%&#xff0c;预计2025年将达30%&#xff0c;借此其利天下有限公司进一步提升了无刷风扇灯驱动方案。 一、性能参数 电压&a…...

数据库系统综合应用与深度实践指南

前言 在当今数据驱动的时代&#xff0c;数据库技术已成为信息系统的核心支柱。从简单的数据存储到复杂的企业级应用&#xff0c;数据库系统支撑着现代社会的方方面面。本文作为一篇综合性的数据库科普文章&#xff0c;旨在为读者提供从基础到进阶的完整知识体系&#xff0c;涵…...

「Unity3D」TextMeshPro使用TMP_InputField实现,输入框高度自动扩展与收缩

先看实现效果&#xff1a; 要实现这个效果&#xff0c;有三个方面的问题需要解决&#xff1a; 第一&#xff0c;输入框的高度扩展&#xff0c;内部子元素会随着锚点&#xff0c;拉伸变形——要解决这个问题&#xff0c;需要将内部元素改变父类&#xff0c;然后增加父类高度&am…...

SAP-ABAP:在SAP系统中,COEP表(成本控制对象行项目表)详解

在SAP系统中&#xff0c;**COEP表&#xff08;成本控制对象行项目表&#xff09;**是成本控制&#xff08;CO&#xff09;模块的核心数据表之一&#xff0c;主要用于存储与成本核算相关的详细行项目数据。以下是对其作用的详细解析&#xff1a; 一、 COEP表的核心作用 存储成本…...

crashpad 编译

一环境配置 1.1设置系统UTF8编码 1.2vs2017语言环境设置英文包 二.获取depot_tools&#xff08;此步骤可以跳过 最新工具包已上传下载使用即可&#xff09; windows下载压缩包&#xff0c;然后放到系统PATH中 下载完以后&#xff0c;基本就是靠depot_tools这个工具集合了&am…...

Windows系统安装Docker(Win10系统升级,然后安装)

有时需要在自己笔记本跑下代码&#xff0c;所以安装Dockers&#xff0c;步骤如下&#xff1a; 1. 升级系统&#xff08;Windows10专业版或者Windows11&#xff09; Windows10家庭版装Docker较麻烦&#xff0c;所以我将Win10升级为Win11了&#xff08;免费&#xff09;&#x…...

【Fifty Project - D21】

今日完成记录 TimePlan完成情况9&#xff1a;00 - 10&#xff1a;00爬楼梯√12&#xff1a;00 - 14&#xff1a;00Leetcode√14&#xff1a;00 - 15&#xff1a;00《挪威的森林》√ Leetcode 每日一题 今天的每日一题是个easy&#xff1a;给定一个数组&#xff0c;要求统计…...

中央网信办部署开展“清朗·整治AI技术滥用”专项行动

为规范AI服务和应用&#xff0c;促进行业健康有序发展&#xff0c;保障公民合法权益&#xff0c;近日&#xff0c;中央网信办印发通知&#xff0c;在全国范围内部署开展为期3个月的“清朗整治AI技术滥用”专项行动。 中央网信办有关负责人表示&#xff0c;本次专项行动分两个阶…...

《Python实战进阶》 No46:CPython的GIL与多线程优化

Python实战进阶 No46&#xff1a;CPython的GIL与多线程优化 摘要 全局解释器锁&#xff08;GIL&#xff09;是CPython的核心机制&#xff0c;它保证了线程安全却限制了多核性能。本节通过concurrent.futures、C扩展优化和多进程架构&#xff0c;实战演示如何突破GIL限制&#…...

BOTA新六维力传感器PixONE:用12维度力矩与运动感测,驱动人形机器人力控未来

在机器人技术日益发展的今天&#xff0c;六维力传感器对于提升机器人感知环境、增强操作精度发挥着重要作用。瑞士BOTA Systems是一家专注于机器人传感器技术的公司&#xff0c;致力于为原始设备制造商提供高性能的传感器解决方案。 PixONE是BOTA推出的一款创新的高精度传感器&…...

《PyTorch documentation》(PyTorch 文档)

PyTorch documentation(PyTorch 文档) PyTorch is an optimized tensor library for deep learning using GPUs and CPUs. (PyTorch是一个优化的张量库,用于使用GPU和CPU进行深度学习。) Features described in this documentation are classified by release status: (此…...