ros2笔记-2.5.3 多线程与回调函数
本节体验下多线程。
python示例
在src/demo_python_pkg/demo_python_pkg/下新建文件,learn_thread.py
import threading
import requestsclass Download:def download(self,url,callback):print(f'线程:{threading.get_ident()} 开始下载:{url}')reponse = requests.get(url)reponse.encoding = 'utf-8'callback(url,reponse.text)def start_download(self,url,callback):thread = threading.Thread(target=self.download,args=(url,callback))thread.start() def world_cout(url,result):print(f"{url}:{len(result)}->{result[:30]}")def main():download = Download()download.start_download('https://fishros.com/d2lros2/#/humble/chapt1/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB',world_cout) download.start_download('https://fishros.com/d2lros2/#/humble/chapt2/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB',world_cout) download.start_download('https://fishros.com/d2lros2/#/humble/chapt3/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB',world_cout)
python的线程库是threading,http请求库是requests.
Download 类定义了两个方法download、start_download。其中download 是真正的下载,start_download启动thread来运行目标函数download。
回调函数world_cout,用于处理下载完成的数据。main函数是入口,实例化一个Download类型的对象download,分别去下载,url 测试下。书上例子是自己造的TXT。

在setup.py添加learn_thread节点,编译后运行。
bohu@bohu-TM1701:~/2/2_ws$ colcon build
Starting >>> demo_cpp_pkg
Finished <<< demo_cpp_pkg [0.16s]
Starting >>> demo_python_pkg
Finished <<< demo_python_pkg [1.24s] Summary: 2 packages finished [1.75s]
bohu@bohu-TM1701:~/2/2_ws$ ros2 run demo_python_pkg learn_thread
线程:126326222620224 开始下载:https://fishros.com/d2lros2/#/humble/chapt1/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB
线程:126326212134464 开始下载:https://fishros.com/d2lros2/#/humble/chapt2/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB
线程:126326126151232 开始下载:https://fishros.com/d2lros2/#/humble/chapt3/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB
https://fishros.com/d2lros2/#/humble/chapt1/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB:5794-><!DOCTYPE html>
<html lang="en
https://fishros.com/d2lros2/#/humble/chapt3/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB:5794-><!DOCTYPE html>
<html lang="en
https://fishros.com/d2lros2/#/humble/chapt2/%E7%AB%A0%E8%8A%82%E5%AF%BC%E8%AF%BB:5794-><!DOCTYPE html>
<html lang="en
C++示例
先下载依赖库
bohu@bohu-TM1701:~/2/2_ws/src/demo_cpp_pkg/include$ git clone https://gitee.com/ohhuo/cpp-httplib.git
正克隆到 'cpp-httplib'...
remote: Enumerating objects: 4527, done.
remote: Total 4527 (delta 0), reused 0 (delta 0), pack-reused 4527
接收对象中: 100% (4527/4527), 2.27 MiB | 2.55 MiB/s, 完成.
处理 delta 中: 100% (3057/3057), 完成.
下载完成后,还要在CMakeLists.txt 添加目录
include_directories(include) #包含include头文件目录
在2_ws/src/demo_cpp_pkg/src下新建learn_thread.cpp文件。
#include <iostream>
#include <thread>
#include <chrono> //时间相关
#include <functional>
#include <cpp-httplib/httplib.h>
using namespace std;class Download
{public:void download(const string &host,const string &path,const function<void(const string &,const string &)> &callback){cout<<" 线程ID: "<< this_thread::get_id() << endl;httplib::Client client(host);auto response = client.Get(path);if(response && response->status==200){callback(path,response->body);} };void start_download(const string &host,const string &path,const function<void(const string &,const string &)> &callback){auto download_fun = bind(&Download::download,this,placeholders::_1,placeholders::_2,placeholders::_3);thread thread(download_fun,host,path,callback);thread.detach(); }; };int main()
{auto d= Download();auto word_count = [](const string &path,const string &result) -> void{cout << "下载完成" << path <<""<<result.length()<<"->"<<result.substr(0,100)<< endl;};d.start_download("http://0.0.0.0:8000","/novel1.txt",word_count);d.start_download("http://0.0.0.0:8000","/novel2.txt",word_count);d.start_download("http://0.0.0.0:8000","/novel3.txt",word_count);this_thread::sleep_for(chrono::seconds(10));return 0;
}
开头还是引用头文件。然后声明了Download类,添加了download函数和start_download函数。
download函数使用了httplib下载,start_download函数里面thread.detach(); 将线程与当前进程分离,使得线程可以后台运行。
main函数是入口,通过lambda创建了回调函数。并三次调用start_download 下载。最后延迟了10秒,防止程序直接退出。
在CMakeLists.txt 添加节点,编译运行。运行结果:
bohu@bohu-TM1701:~/2/2_ws$ ros2 run demo_cpp_pkg learn_thread
线程ID: 138510887552576
线程ID: 138510877066816
线程ID: 138510747043392
下载完成/novel2.txt85-> BH8VYW,你好,这里是BH8ZZZ,你的信号是59,能否抄收我的信号?
下载完成/novel3.txt85-> BH8ZZZ,你好,这里是BH8VYW,你的信号是59,能够抄收你的信号。
下载完成/novel1.txt70->CQ,CQ,CQ,这里是BH8VYW,这里是BH8VYW,收到请回答。
相关文章:
ros2笔记-2.5.3 多线程与回调函数
本节体验下多线程。 python示例 在src/demo_python_pkg/demo_python_pkg/下新建文件,learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程:{threading.get_ident()} 开始下载:{…...
第5章:Go语言错误处理和异常
第5章:Go语言错误处理和异常 5.1 错误类型基础 5.1.1 error接口 // error接口定义 type error interface {Error() string }// 自定义错误 type CustomError struct {Message stringCode int }func (e *CustomError) Error() string {return fmt.Sprintf(&quo…...
题库刷题知识点总结
算法与机器学习相关 支持向量机:是一种有监督的机器学习算法,用于分类和回归任务。它通过寻找一个最优超平面来将不同类别的数据点分开,最大化两类数据点到超平面的间隔,具有良好的泛化能力和抗噪声能力。机器学习:是…...
GraphRAG:LLM之Graphrag接入milvus
前言 微软目前的graphrag更像个demo,数据量大的时候不是很友好的啊,所以将milvus接入了graphrag,看完这篇文章,其他数据库接入应该也没问题 注:这篇文章只是在search的时候接入进来,index过程或者说整个流…...
adb使用及常用命令
目录 介绍 组成 启用adb调试 常用命令 连接设备 版本信息 安装应用 卸载应用 文件操作 日志查看 屏幕截图和录制 设备重启 端口转发 调试相关 设置属性 设备信息查询 获取帮助 模拟输入 介绍 adb全称为 Android Debug Bridge(Android调试桥),是 A…...
omnipeek分析beacon帧
omnipeek查询设备发送beacon时同一信道两个beacon发送间隔 目录 用例要求分析抓包数据 1.用例要求 Beacon帧发送频率符合规范要求。参数-【同一个信道两个beacon发送间隔不能超过100ms】 2.分析抓包数据 打开becon.pkt文件(用omnipeek工具提前抓取包)…...
Java数组问题
题目2: 定义一个数组,存储1,2,3,4,5,6,7,8,9,10 遍历数组得到的每一个元素,统计数组里面一共多少个能被3整除的数字 package com.s…...
salesforce 可以为同一个简档的同一个 recordtype 的对象设置多种页面布局吗
在 Salesforce 中,对于同一个 Record Type(记录类型),默认情况下,每个 Profile(用户简档) 只能分配一个 Page Layout(页面布局)。也就是说,页面布局的分配规则…...
使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
在 Vue 项目中,使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比: 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本(如 Vue CLI 2.x)中提供的项目初始化模…...
五、包图
包图 、基本概念 概念: 用来描述模型中的包和其所含元素的组织方式的图,是维护和控制系统总体结构的重要内容。 包可以把所建立的各种模型组织起来,形成各种功能或用途的模块,并可以控制包中元素的可见性以及描述包之间的依赖…...
关于重构一点简单想法
关于重构一点简单想法 当前工作的组内,由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点,组内语言技术栈存在:php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑,一些基础的逻辑也没有办法复用。 在这…...
kafka使用以及基于zookeeper集群搭建集群环境
一、环境介绍 zookeeper下载地址:https://zookeeper.apache.org/releases.html kafka下载地址:https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…...
GAN对抗生成网络(二)——算法及Python实现
1 算法步骤 上一篇提到的GAN的最优化问题是,本文记录如何求解这一问题。 首先为了表示方便,记,这里让最大的可视作常量。 第一步,给定初始的,使用梯度上升找到 ,最大化。关于梯度下降,可以参考笔者另一篇…...
并发线程(21)——线程池
文章目录 二十一、day211. 线程池实现1.1 完整代码1.2 解释 二十一、day21 我们之前在学习std::future、std::async、std::promise相关的知识时,通过std::promise和packaged_task构建了一个可用的线程池,可参考文章:并发编程(6&a…...
基于32单片机的智能语音家居
一、主要功能介绍 以STM32F103C8T6单片机为控制核心,设计一款智能远程家电控制系统,该系统能实现如下功能: 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…...
VScode怎么重启
原文链接:【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行,如下图: 输入Reload Window,如下图:...
分析服务器 systemctl 启动gozero项目报错的解决方案
### 分析 systemctl start beisen.service 报错 在 Linux 系统中,systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时,如果服务启动失败,systemctl 会输出错误信息,帮助我们诊断和解决问题。 本文将通过一个实际的…...
大模型LLM-Prompt-OPTIMAL
1 OPTIMAL OPTIMAL 具体每项内容解释如下: Objective Clarity(目标清晰):明确定义任务的最终目标和预期成果。 Purpose Definition(目的定义):阐述任务的目的和它的重要性。 Information Gat…...
3. 多线程(1) --- 创建线程,Thread类
文章目录 前言1. API2. 创建线程2.1. 继承 Thread类2.2. 实现 Runnable 接口2.3. 匿名内部类2.4. lambda2.5.其他方法 3. Thread类及其常见的方法和属性3.1. Thread 的常见构造方法3.2. Thread 的常见属性3.3. start() --- 启动一个线程3.4. 中断一个线程3.5. 等待线程3.6. 休眠…...
简单的jmeter数据请求学习
简单的jmeter数据请求学习 1.需求 我们的流程服务由原来的workflow-server调用wfms进行了优化,将wfms服务操作并入了workflow-server中,去除了原来的webservice服务调用形式,增加了并发处理,现在想测试模拟一下,在一…...
NearDrop:在macOS上实现Android文件快速传输的完整指南
NearDrop:在macOS上实现Android文件快速传输的完整指南 【免费下载链接】NearDrop An unofficial Google Nearby Share/Quick Share app for macOS 项目地址: https://gitcode.com/gh_mirrors/ne/NearDrop 想要在Mac和Android设备之间实现快速、便捷的文件传…...
FDTD算法实战:从理论到代码实现
1. FDTD算法入门:电磁仿真的"时间切片"艺术 第一次接触FDTD算法时,我被它独特的思维方式惊艳到了——就像用高速摄像机拍摄电磁场的舞蹈,把连续的时间切成无数个瞬间定格。这种时域有限差分方法(Finite-Difference Time…...
实时体积云渲染进阶:Perlin与Worley噪声的混合艺术
1. 理解体积云渲染的基础噪声 在实时体积云渲染中,噪声算法扮演着关键角色。就像画家需要不同的笔触来表现云层的质感,我们需要Perlin和Worley这两种基础噪声来构建云的形态。这两种噪声各有特点,理解它们的差异是混合使用的前提。 Perlin噪声…...
Aseprite进阶指南:从像素瓦片到Unity动态Tilemap实战
1. 像素瓦片素材的规范设计 在开始使用Aseprite绘制像素瓦片之前,我们需要先明确一些基本规范。这些规范不仅关系到后续在Unity中的使用效果,更直接影响游戏地图的整体表现和性能优化。 首先说说尺寸问题。我强烈建议使用16x16像素作为基础单位ÿ…...
AgentCPM-Report部署案例:Pixel Epic在金融风控部门的实时舆情简报生成
AgentCPM-Report部署案例:Pixel Epic在金融风控部门的实时舆情简报生成 1. 项目背景与需求分析 金融风控部门每天需要处理海量的市场舆情信息,传统的人工简报制作方式面临三大挑战: 时效性不足:人工整理需要4-6小时,…...
解锁Windows无限可能:Windhawk模块化定制完全指南
解锁Windows无限可能:Windhawk模块化定制完全指南 【免费下载链接】windhawk The customization marketplace for Windows programs: https://windhawk.net/ 项目地址: https://gitcode.com/gh_mirrors/wi/windhawk 你是否曾对Windows系统一成不变的界面感到…...
、SEATA分布式事务——XA模式磺
MySQL 中的 count 三兄弟:效率大比拼! 一、快速结论(先看结论再看分析) 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的!我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄弟…...
Zsh安全警报不用慌:3种方法彻底解决compinit目录权限问题
Zsh安全警报不用慌:3种方法彻底解决compinit目录权限问题 每次打开终端时看到那个恼人的"compinit: insecure directories"警告,确实让人头疼。作为Zsh用户,我们既想享受这个强大shell带来的便利,又不希望被安全警告打…...
软件再工程的逆向分析与重构改造
软件再工程的逆向分析与重构改造 在快速发展的信息技术时代,许多遗留系统因技术落后、架构臃肿或文档缺失而难以维护。软件再工程通过逆向分析与重构改造,帮助企业对旧系统进行现代化升级,提升可维护性和扩展性。这一过程不仅能够降低技术债…...
5分钟拯救珍贵视频!untrunc视频修复工具终极指南
5分钟拯救珍贵视频!untrunc视频修复工具终极指南 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 您是否曾因相机突然断电、存储卡故障或传输中断而丢失珍…...
