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

进程池(C/C++)

C语言实现

/* * 进程池示例 * 使用消息队列进行任务分发 */#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/wait.h>#include<sys/msg.h>#include<string.h>#defineWORKER_NUM3// 进程池中工作进程的数量#defineMSG_KEY12345// 消息队列的 key#defineMSG_TYPE1// 消息类型/* 消息结构体(必须包含 long type) */structmsgbuf{longtype;// 消息类型(用于区分)inttask_id;// 任务编号};/* 子进程(工作进程)入口函数 */voidworker_process(intmsgid){structmsgbufmsg;while(1){/* * 从消息队列接收任务 * msg.type = MSG_TYPE:只接收该类型的消息 * 0:阻塞等待 */msgrcv(msgid,&msg,sizeof(msg.task_id),MSG_TYPE,0);printf("[Worker PID=%d] start task %d\n",getpid(),msg.task_id);sleep(2);// 模拟任务执行耗时printf("[Worker PID=%d] finish task %d\n",getpid(),msg.task_id);}}intmain(){pid_tpid;intmsgid;/* 创建消息队列(用于父进程给子进程发任务) */msgid=msgget(MSG_KEY,IPC_CREAT|0666);if(msgid<0){perror("msgget");exit(1);}/* 创建进程池 */for(inti=0;i<WORKER_NUM;i++){pid=fork();if(pid<0){perror("fork");exit(1);}if(pid==0){// 子进程:成为 workerworker_process(msgid);exit(0);// worker 不会回到 main}else{// 父进程:继续创建下一个 workerprintf("Create worker PID=%d\n",pid);}}/* 父进程:发送任务 */for(inttask_id=1;task_id<=10;task_id++){structmsgbufmsg;msg.type=MSG_TYPE;msg.task_id=task_id;/* * 发送任务到消息队列 * 子进程会通过 msgrcv 竞争获取任务 */msgsnd(msgid,&msg,sizeof(msg.task_id),0);printf("[Master] send task %d\n",task_id);sleep(1);// 控制任务产生速度}/* 回收子进程(实际工程中通常会用信号优雅退出) */while(1){wait(NULL);}return0;}

🛠 编译 & 运行
gcc process_pool.c -o process_pool
./process_pool

**

c++实现

**

#include<iostream>#include<vector>#include<unistd.h>#include<sys/wait.h>#include<fcntl.h>#include<cstring>#include<algorithm>/* * Worker 进程类 * 每个 Worker 绑定一条管道 */classWorker{public:pid_t pid;// 子进程 PIDintpipe_fd;// 读端文件描述符Worker(pid_t p,intfd):pid(p),pipe_fd(fd){}};/* * 进程池类 */classProcessPool{private:std::vector<Worker>workers;size_t next_worker=0;// 轮询索引(RR 调度)public:/* * 构造函数:创建进程池 */ProcessPool(size_t worker_num){for(size_t i=0;i<worker_num;++i){intpipefd[2];// 创建管道if(pipe(pipefd)==-1){perror("pipe");exit(1);}pid_t pid=fork();if(pid<0){perror("fork");exit(1);}if(pid==0){// ===== 子进程 =====close(pipefd[1]);// 关闭写端worker_loop(pipefd[0]);exit(0);}else{// ===== 父进程 =====close(pipefd[0]);// 关闭读端workers.emplace_back(pid,pipefd[1]);std::cout<<"[Master] Create worker pid="<<pid<<std::endl;}}}/* * 子进程主循环 */voidworker_loop(intread_fd){inttask_id;while(true){ssize_t n=read(read_fd,&task_id,sizeof(task_id));if(n<=0)break;// 管道关闭std::cout<<"[Worker PID="<<getpid()<<"] start task "<<task_id<<std::endl;sleep(2);// 模拟任务执行std::cout<<"[Worker PID="<<getpid()<<"] finish task "<<task_id<<std::endl;}}/* * 分发任务(Round Robin) */voiddispatch(inttask_id){size_t idx=next_worker;next_worker=(next_worker+1)%workers.size();write(workers[idx].pipe_fd,&task_id,sizeof(task_id));std::cout<<"[Master] assign task "<<task_id<<" to worker "<<workers[idx].pid<<std::endl;}/* * 回收子进程 */~ProcessPool(){for(auto&w:workers){close(w.pipe_fd);waitpid(w.pid,nullptr,0);}}};intmain(){ProcessPoolpool(3);// 创建 3 个 workerfor(inti=1;i<=10;++i){pool.dispatch(i);sleep(1);// 控制任务速率}return0;}
http://www.jsqmd.com/news/818669/

相关文章:

  • 量化交易入门必学之——交易中不可避免的一笔成本
  • BMJ Open与Perplexity深度耦合实验(仅限2024Q3授权机构访问的私有检索协议曝光)
  • Veo 2与Sora、Pika、Runway ML v4终极横评:18项指标实测(含时长支持、物理仿真、多主体追踪)
  • 木门全国直供怎么做线上获客?2026工程商采购决策路径与推广指南 - 年度推荐企业名录
  • 2025最权威的六大AI辅助写作助手解析与推荐
  • 在线水印去除怎么做?2026年在线水印去除工具推荐与方法盘点
  • 不止于安装:手把手教你用DataHub摄取MySQL和Hive元数据(附完整recipe.yml配置)
  • 2026防撞墙切割技术全解析:支撑梁切割、桥墩切割、桥梁切割公司、桥梁拆除、桥梁防撞墙切割、楼板切割、水下混凝土切割选择指南 - 优质品牌商家
  • Neovim状态栏插件Parrot.nvim:模块化设计与极致性能优化
  • Griptape框架:构建具备长期记忆与工具调用能力的AI智能体系统
  • 全球直播联盟直击包头|2026年内蒙古公共图书馆全民阅读活动暨“书香满包头”系列盛典启幕
  • 开源知识管理工具Mindolph:文件优先的跨平台笔记聚合器
  • 高颜值、免费又好用的Linux命令速查神器:TUX星球,强烈推荐给大家!!
  • AI应用插件化架构:archcore-plugin核心原理与开发实战
  • 2026芝麻灰火烧板技术解析:五莲红火烧板/五莲花火烧板/五莲花路沿石/大理石火烧板/大理石路缘石/芝麻灰火烧板/选择指南 - 优质品牌商家
  • Midjourney Dirt印相实操手册:5个隐藏参数+7类噪点映射公式,精准控制颗粒/划痕/泛黄层次
  • 医爱公益开展护士节致敬活动
  • 【大白话说Java面试题 第50题】【JVM篇】第10题:双亲委派模型的好处是什么?
  • 第二章:Hook的艺术 —— 使用Frida篡改运行时内存
  • 2026年Q2宝山叉车培训考证全流程技术指南附机构信息:上海住建委电焊证报名、上海叉车考证学校、上海叉车证年审选择指南 - 优质品牌商家
  • HC9615高精度、高纹波抑制比、低噪声、超快响应LDO
  • 2026五莲花火烧板技术全解:芝麻黑火烧板、芝麻黑路沿石、花岗岩火烧板、花岗岩路沿石、花岗岩路边石、鲁灰火烧板选择指南 - 优质品牌商家
  • 4KAgent:基于RAG与智能体编排的超长上下文处理框架解析
  • 2026年空气流量传感器实力厂商盘点:盛洲汽车零部件专业实力解析 - 2026年企业推荐榜
  • 终极指南:如何为OpenWrt路由器安装turboacc网络加速插件,释放路由器潜能
  • 【方便办公】OpenClaw v2.7.1 Win10 安装路径与权限设置详解(含安装包)
  • 以帧为墨,以技为笔:三维动画制作,是技术的修行,更是创意的重生
  • 免费开源Navicat密码查看工具:3步轻松解密遗忘的数据库连接密码
  • 开源项目模板:一键搭建团队协作的工程化基石
  • 【独家首发】DeepSeek-R1在Azure AI Studio的GPU推理优化方案:吞吐提升217%,成本下降42%