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

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/下新建文件&#xff0c;learn_thread.py import threading import requestsclass Download:def download(self,url,callback):print(f线程&#xff1a;{threading.get_ident()} 开始下载&#xff1a;{…...

第5章:Go语言错误处理和异常

第5章&#xff1a;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…...

题库刷题知识点总结

算法与机器学习相关 支持向量机&#xff1a;是一种有监督的机器学习算法&#xff0c;用于分类和回归任务。它通过寻找一个最优超平面来将不同类别的数据点分开&#xff0c;最大化两类数据点到超平面的间隔&#xff0c;具有良好的泛化能力和抗噪声能力。机器学习&#xff1a;是…...

GraphRAG:LLM之Graphrag接入milvus

前言 微软目前的graphrag更像个demo&#xff0c;数据量大的时候不是很友好的啊&#xff0c;所以将milvus接入了graphrag&#xff0c;看完这篇文章&#xff0c;其他数据库接入应该也没问题 注&#xff1a;这篇文章只是在search的时候接入进来&#xff0c;index过程或者说整个流…...

adb使用及常用命令

目录 介绍 组成 启用adb调试 常用命令 连接设备 版本信息 安装应用 卸载应用 文件操作 日志查看 屏幕截图和录制 设备重启 端口转发 调试相关 设置属性 设备信息查询 获取帮助 模拟输入 介绍 adb全称为 Android Debug Bridge(Android调试桥)&#xff0c;是 A…...

omnipeek分析beacon帧

omnipeek查询设备发送beacon时同一信道两个beacon发送间隔 目录 用例要求分析抓包数据 1.用例要求 Beacon帧发送频率符合规范要求。参数-【同一个信道两个beacon发送间隔不能超过100ms】 2.分析抓包数据 打开becon.pkt文件&#xff08;用omnipeek工具提前抓取包&#xff09…...

Java数组问题

题目2&#xff1a; 定义一个数组&#xff0c;存储1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8&#xff0c;9&#xff0c;10 遍历数组得到的每一个元素&#xff0c;统计数组里面一共多少个能被3整除的数字 package com.s…...

salesforce 可以为同一个简档的同一个 recordtype 的对象设置多种页面布局吗

在 Salesforce 中&#xff0c;对于同一个 Record Type&#xff08;记录类型&#xff09;&#xff0c;默认情况下&#xff0c;每个 Profile&#xff08;用户简档&#xff09; 只能分配一个 Page Layout&#xff08;页面布局&#xff09;。也就是说&#xff0c;页面布局的分配规则…...

使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢

在 Vue 项目中&#xff0c;使用 Webpack 模板 和 vue.config.js 来配置相关插件的主要区别在于配置的复杂度、灵活性和易用性。以下是两者的详细对比&#xff1a; 1. Webpack 模板 Webpack 模板是 Vue CLI 早期版本&#xff08;如 Vue CLI 2.x&#xff09;中提供的项目初始化模…...

五、包图

包图 、基本概念 概念&#xff1a; 用来描述模型中的包和其所含元素的组织方式的图&#xff0c;是维护和控制系统总体结构的重要内容。 包可以把所建立的各种模型组织起来&#xff0c;形成各种功能或用途的模块&#xff0c;并可以控制包中元素的可见性以及描述包之间的依赖…...

关于重构一点简单想法

关于重构一点简单想法 当前工作的组内&#xff0c;由于业务开启的时间正好处于集团php-》go技术栈全面迁移的时间点&#xff0c;组内语言技术栈存在&#xff1a;php、go两套。 因此需求开发过程中通常要考虑两套技术栈的逻辑&#xff0c;一些基础的逻辑也没有办法复用。 在这…...

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;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的最优化问题是&#xff0c;本文记录如何求解这一问题。 首先为了表示方便&#xff0c;记&#xff0c;这里让最大的可视作常量。 第一步&#xff0c;给定初始的&#xff0c;使用梯度上升找到 ,最大化。关于梯度下降&#xff0c;可以参考笔者另一篇…...

并发线程(21)——线程池

文章目录 二十一、day211. 线程池实现1.1 完整代码1.2 解释 二十一、day21 我们之前在学习std::future、std::async、std::promise相关的知识时&#xff0c;通过std::promise和packaged_task构建了一个可用的线程池&#xff0c;可参考文章&#xff1a;并发编程&#xff08;6&a…...

基于32单片机的智能语音家居

一、主要功能介绍 以STM32F103C8T6单片机为控制核心&#xff0c;设计一款智能远程家电控制系统&#xff0c;该系统能实现如下功能&#xff1a; 1、可通过语音命令控制照明灯、空调、加热器、窗户及窗帘的开关&#xff1b; 2、可通过手机显示和控制照明灯、空调、窗户及窗帘的开…...

VScode怎么重启

原文链接&#xff1a;【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行&#xff0c;如下图&#xff1a; 输入Reload Window&#xff0c;如下图&#xff1a;...

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中&#xff0c;systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时&#xff0c;如果服务启动失败&#xff0c;systemctl 会输出错误信息&#xff0c;帮助我们诊断和解决问题。 本文将通过一个实际的…...

大模型LLM-Prompt-OPTIMAL

1 OPTIMAL OPTIMAL 具体每项内容解释如下&#xff1a; Objective Clarity&#xff08;目标清晰&#xff09;&#xff1a;明确定义任务的最终目标和预期成果。 Purpose Definition&#xff08;目的定义&#xff09;&#xff1a;阐述任务的目的和它的重要性。 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进行了优化&#xff0c;将wfms服务操作并入了workflow-server中&#xff0c;去除了原来的webservice服务调用形式&#xff0c;增加了并发处理&#xff0c;现在想测试模拟一下&#xff0c;在一…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...