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服务调用形式,增加了并发处理,现在想测试模拟一下,在一…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...