当前位置: 首页 > 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;在一…...

大数据学习(129)-Hive数据分析

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…...

PHP 表单 - 验证邮件和URL

PHP 表单 - 验证邮件和URL 引言 在Web开发中&#xff0c;表单是用户与网站交互的重要途径。一个功能完善的表单不仅可以收集用户数据&#xff0c;还能提高用户体验。在表单设计中&#xff0c;验证邮件地址和URL是常见的需求。本文将详细介绍如何在PHP中实现邮件和URL的验证&a…...

Spring Cloud Alibaba Seata安装+微服务实战

目录 介绍核心功能三层核心架构安装微服务实战创建三个业务数据库编写库存和账户两个Feign接口订单微服务 seata-order-service9701库存微服务 seata-store-service9702账户微服务 seata-account-service9703测试结果 总结 介绍 Spring Cloud Alibaba Seata 是一款开源的分布式…...

全球化2.0|云轴科技ZStack助力香港服务机构VMware替代

香港一家大型社会服务机构长期致力于为公众提供支持与服务&#xff0c;是本地具有代表性的社会服务组织&#xff0c;在香港设有数十个服务中心。为应对VMware订阅模式带来的成本上升和硬件资源受限等问题&#xff0c;该机构决定采用云轴科技ZStack Cloud云平台替代VMware虚拟化…...

Elasticsearch从安装到实战、kibana安装以及自定义IK分词器/集成整合SpringBoot详细的教程ES(三)

DSL官方地址&#xff1a; DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0…...

html - <mark>标签

<mark> 标签在HTML中用于高亮显示文本&#xff0c;通常用于突出显示某些重要的部分。它的默认样式通常是背景色为黄色&#xff0c;但你可以通过CSS自定义其外观。 1. 基本用法 <mark> 标签用于标记文本的高亮显示。它常用于搜索结果中&#xff0c;突出显示匹配的…...

【Elasticsearch】映射:Join 类型、Flattened 类型、多表关联设计

映射&#xff1a;Join 类型、Flattened 类型、多表关联设计 1.Join 类型1.1 主要应用场景1.1.1 一对多关系建模1.1.2 多层级关系建模1.1.3 需要独立更新子文档的场景1.1.4 文档分离但需要关联查询 1.2 使用注意事项1.3 与 Nested 类型的区别 2.Flattened 类型2.1 实际运用场景和…...

Vue-Leaflet地图组件开发(三)地图控件与高级样式设计

第三篇&#xff1a;Vue-Leaflet地图控件与高级样式设计 1. 专业级比例尺组件实现 1.1 比例尺控件集成 import { LControl } from "vue-leaflet/vue-leaflet";// 在模板中添加比例尺控件 <l-control-scaleposition"bottomleft":imperial"false&qu…...

正则持续学习呀

源匹配为 (.*): (.*)$ 替换匹配为 "$1": "$2", 可将headers改为字典 参考 【爬虫军火库】如何优雅地复制请求头 - 知乎...

分类场景数据集大全「包含数据标注+训练脚本」 (持续原地更新)

一、作者介绍&#xff1a;六年算法开发经验、AI 算法经理、阿里云专家博主。擅长&#xff1a;检测、分割、理解、大模型 等算法训练与推理部署任务。 二、数据集介绍&#xff1a; 质量高&#xff1a;高质量图片、高质量标注数据&#xff0c;吐血标注、整理&#xff0c;可以作为…...