当前位置:   article > 正文

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

c++实现多进程

一、概述

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;
	};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 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;                  // 视频文件内容
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

六、软件开发依赖

  • C++11、libboost1.66+、libzmq、libffmpeg4.2+、libopencv4.4+
  • openresty
cpp_master_worker依赖第三方库地址
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/1014308
推荐阅读
相关标签
  

闽ICP备14008679号