C++多进程master-worker工作机制较完整的实现,边端和云端协同工作实现

一、概述

1. 仓库链接与参考
  • 仓库位置: cpp_master_worker.git
  • Python参考: 如果需要使用Python编写master端,请参考这篇文章,提供了Cpp编写的TCP服务端,以及Cpp和Python版本的TCP客户端。
2. 模块概述
名称描述
master进程 (master_app)监控和管理引擎的守护进程,负责策略下发和数据收集。包括网络通信、进程管理、心跳检测、数据封装和解封装模块。
worker进程 (worker_app)负责视频数据的解码和推理,包括基于OpenCV修改的人脸识别功能。每个进程包含两个工作线程。
轨迹视频叠加服务 (draw-track-server)基于OpenResty开发,用于在视频上绘制轨迹。
3. 技术要求与设计特点
  • 多进程master-worker工作机制: 项目要求设计。
  • 自定义序列化模块: 使用C++11开发,支持二进制序列化和反序列化,具体细节可查看此链接

二、master进程与worker进程间管理和交互

1. master管理worker进程

管理worker进程

  • 功能概述: master进程负责启动和停止worker进程。
  • 参数传递: 仅传递唯一的序号 (0-99) 给worker进程。
2. master心跳检测worker进程

心跳检测

  • 功能概述: master和worker基于共享内存进行心跳检测,确保进程健康运行。
3. master与worker进程之间信息交互

信息交互

  • 通信模型: 使用基于zmq的发布-订阅模型,实现单向通信。
  • 消息过滤: worker根据id过滤消息,同时提供ipc通道以供master订阅。
4. 检测上报流程

上报流程

  • 流程概述: master下发camera信息至worker,处理后的结果通过自定义序列化发送给master,再传递给轨迹叠加服务。
5. master进程启动worker进程流程
  • 读取配置文件,启动指定数量的worker进程。
  • 下发camera信息至worker进程。

三、程序结构

1. master_app进程

master_app结构

  • 模块关系: 使用boost库处理配置文件读取、进程管理、HTTP上传等功能。
2. worker_app进程

worker_app结构

  • 模块关系: 包括ffmpeg解码、CUDA加速、Nvmpi解码等功能,以及消息队列缓存和调试宏。

四、轨迹视频叠加服务器

1. 程序结构

draw-track-server结构

  • 模块概述: 包括视频和轨迹叠加模块、基于OpenResty的HTTP服务、测试客户端程序。
2. 工作流程
  • nginx转发HTTP请求至do_upload.lua,处理轨迹文本和视频文件。
  • 调用libvideo_bbox_drawer.so完成轨迹和视频的叠加。

五、关键结构体设计

  • 上报检测轨迹: 用于worker和轨迹叠加服务的数据结构。
	struct Rect_t
	{
	    uint32_t x   = 0;       //
	    uint32_t y   = 0;       //
	    uint32_t w   = 0;       // 宽
	    uint32_t h   = 0;       // 高
	};
	
	struct Track_t
	{
	    uint32_t f   = 0;       // 帧序号
	    Rect_t  rect;           //
	};
	
	// 上报轨迹信息
	struct TrajectoryInfo_t
	{
	    std::string             video_name;
	    uint32_t                video_width;
	    uint32_t                video_height;
	    uint32_t                video_framerate;
	    std::vector<Track_t>    tracks;
	};
  • zmq消息通信结构体: 用于master和worker进程间通信。
// 摄像机下发信息
struct CameraInfo_t
{
    char name[64]               = {0};     // 摄像机名称
    char main_stream[128]       = {0};     // 主流rtsp url
    char alg_param_file[128]    = {0};     // 算法库配置文件
    char camera_id[64]          = {0};     // id
    uint32_t main_pixel_w         = 0;     // width
    uint32_t main_pixel_h         = 0;     // hight
    uint32_t main_frame_rate      = 0;     // 帧率
};

// 需要上传给httpserver
struct VideoAndTracks_t
{
    std::string tracksStr;                  // 轨迹(未base64)
    std::string videoName;                  // 视频文件名
    std::string videoData;                  // 视频文件内容
};

六、软件开发依赖

  • C++11、libboost1.66+、libzmq、libffmpeg4.2+、libopencv4.4+
  • openresty
cpp_master_worker依赖第三方库地址
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘色的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值