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

毕业设计做网站 服务器怎么弄wordpress安装504

毕业设计做网站 服务器怎么弄,wordpress安装504,珠海工商网上登记平台,比利时网站的后缀进程池的定义与核心概念 进程池(Process Pool)是一种用于管理和复用进程资源的编程模型,属于并发编程领域的重要概念。其核心思想是预先创建一组固定数量的进程(称为 “池”),当需要执行任务时&#xff0c…

进程池的定义与核心概念

进程池(Process Pool)是一种用于管理和复用进程资源的编程模型,属于并发编程领域的重要概念。其核心思想是预先创建一组固定数量的进程(称为 “池”),当需要执行任务时,直接从池中获取空闲进程处理任务,任务完成后进程返回池中等待下一次调用,而非频繁创建和销毁进程。

管道就是一个文件,父进程通过管道文件向子进程传递信息,从而控制子进程

进程池的实现

进程结构

1.processpool.hpp
1.channel
class Channel
{
public:Channel(int fd,int id):_wfd(fd),_id(id){_name="channel-" + to_string(_wfd) + "-" + to_string(_id);}void Send(int code){int n=write(_wfd,&code,sizeof(code));}void CloseProcess(){pid_t rid=waitpid(_id,nullptr,0);}void CloseId(){close(_wfd);}int FD() {return _wfd;}pid_t ID() {return _id;}string NAME() {return _name;}private:int _wfd;pid_t _id;string _name;
};

Channel用来表示管道文件,_wfd是管道所对应的文件描述符,_id是管道对应的子进程id,_name是进程名字

Send用来向子进程发送信息,子进程可以根据信息来做出回应

两个close函数用来关闭管道和等待子进程

2.channelmanager
class ChannelManager
{
public:ChannelManager():_next(0){}void Insert(int fd,pid_t id){_channels.emplace_back(fd,id);}Channel& Select(){auto &c=_channels[_next];_next++;_next%=_channels.size();return c;}void StopProcess(){for(auto &c:_channels){c.CloseProcess();cout << "关闭: " << c.NAME() << std::endl;}}void StopId(){for(auto& c:_channels){c.CloseId();cout << "回收: " << c.NAME() << std::endl;}}void Printf(){for(auto &c:_channels){cout<<"子进程的名字是:"<<c.NAME()<<endl;}}private:vector<Channel> _channels;size_t _next;
};

channelmanager用来管理channel的结构体,_channels是一个数组,用来存储channel对象。_next用来处理子进程负载的轮询数据

Insert函数用来插入Channel对象,方便进行管理

Select函数用来处理子进程的负载问题,避免子进程工作量不均衡,这里使用轮询方法,而_next用来处理正确的轮询对象

另外两个Stop函数用来关闭所有的子进程和各自的管道文件

3.processpool
class ProcessPool
{
public:ProcessPool(int num) : _process_num(num){_tm.Register(PrintLog);_tm.Register(Download);_tm.Register(Upload);}void Work(int fd)
{while(true){int code=0;int n=read(fd,&code,sizeof(code));if(n>0){if(n!=sizeof(code)) {continue;}cout<<"子进程"<<getpid()<<' '<<"收到任务码"<<code<<endl;_tm.Execute(code);}else if(n==0){cout<<"子进程退出"<<endl;break;}else{cout<<"读取失败"<<endl;break;}}
}bool Strate()
{for(int i=0;i<_process_num;i++){// 1. 创建管道int fd[2]={0};int n=pipe(fd);if(n<0) return false;// 2. 创建子进程pid_t id=fork();//子读,父写if(id==0){//子进程close(fd[1]);Work(fd[0]);close(fd[0]);exit(0);}else if(id>0){//父进程close(fd[0]);_cm.Insert(fd[1],id);}else{//创建失败return false;}}return true;
}void Run()
{int taskcode=_tm.Code();auto& c=_cm.Select();cout<<"选择了一个子进程为"<<c.NAME()<<endl;c.Send(taskcode);cout<<"发送了一个任务码"<<taskcode<<endl;
}void Stop()
{// 关闭父进程所有的wfd即可_cm.StopId();// 回收所有子进程_cm.StopProcess();
}private:ChannelManager _cm;int _process_num;TaskManager _tm;
};

processpool用来给用户进行管理操作,_cm是管理的对象,_process_num表示进程的数量,_tm用来保存任务的内容,它的函数在另一个.hpp文件中。

构造函数初始化子进程的数量,用来给strate函数创建子进程的数量,而_tm用来插入任务内容

Strate函数可以创建子进程,这里使用for循环进行创建子进程的操作,在创建子进程的时候使用pipe创建管道方便父子进程进行通信,在创建完进程之后,关闭掉不需要的接口,然后子进程等待任务码的写入。

Work函数使用while循环来不断读取管道文件的内容,分为成功读取,读取到文件结尾以及读取失败,当成功读取的时候,它会根据任务码的内容来进行不同的任务,其他两种情况都可以退出程序

2.task.hpp
1.函数指针
typedef void (*task_t)();void PrintLog()
{std::cout << "我是一个打印日志的任务" << std::endl;
}void Download()
{std::cout << "我是一个下载的任务" << std::endl;
}void Upload()
{std::cout << "我是一个上传的任务" << std::endl;
}

这里使用函数指针方便传递任务函数

2.taskmanager
class TaskManager
{
public:TaskManager(){srand(time(nullptr));}void Register(task_t t){_tasks.push_back(t);}int Code(){return rand()%_tasks.size();}void Execute(int code){if(code>=0&&code<_tasks.size()){_tasks[code]();}}
private:vector<task_t> _tasks;
};

TaskManager用来管理任务内容,_task用来插入任务数据。

构造函数与code函数进行联动,使得Code函数每次的任务码都是不一样的。

Register函数用来插入任务内容。

Execute函数根据任务码来进行不同的任务

代码的问题

问题

由于子进程的文件描述符是拷贝父进程的文件描述符,所以之后的子进程会和父进程一样指向之前创建的管道文件

如果关闭管道和等待子进程的步骤错误,就会出现问题

for(int i=0;i<channels.size();i++)
{channels[i].closeid();channels[i].closeprocess();
}

如果以这种形式实现的Stop操作,就会出现阻塞情况,由于关闭的只是当前子进程的管道文件,后面的子进程依旧指向当前的管道文件,此时子进程读取不到文件结尾,也就关闭不了子进程,就发生了阻塞

解决方法

1.在关闭文件的时候从后往前关闭

2.关闭其他子进程的写端


文章转载自:

http://4J17pWTN.mhfbp.cn
http://zLj7dCJx.mhfbp.cn
http://acHkdb8h.mhfbp.cn
http://ayLR8X02.mhfbp.cn
http://iaMjaE5X.mhfbp.cn
http://AXS2uXFC.mhfbp.cn
http://LZS3tneV.mhfbp.cn
http://j8brSotL.mhfbp.cn
http://iNjt9lxW.mhfbp.cn
http://f116FvQg.mhfbp.cn
http://VaYWg9s8.mhfbp.cn
http://saqmnfkw.mhfbp.cn
http://Ell1uE9f.mhfbp.cn
http://MV0PlPuz.mhfbp.cn
http://ZMRDLDcn.mhfbp.cn
http://KLrsYa9z.mhfbp.cn
http://8ykvnyrI.mhfbp.cn
http://wXUuHMi8.mhfbp.cn
http://mJu59DYW.mhfbp.cn
http://quXSKyMw.mhfbp.cn
http://O1xmQJQs.mhfbp.cn
http://XWuR5qvx.mhfbp.cn
http://bP7uwbjg.mhfbp.cn
http://Q4yQgyoi.mhfbp.cn
http://OCHHZl15.mhfbp.cn
http://iwGlYdqn.mhfbp.cn
http://bi8feSep.mhfbp.cn
http://uUurxlWu.mhfbp.cn
http://KOzxkt0Q.mhfbp.cn
http://NGCbgUw0.mhfbp.cn
http://www.dtcms.com/wzjs/681505.html

相关文章:

  • 如何运用企业官方网站做宣传网站构建器
  • 百度站长平台链接提交wordpress设置系统邮箱
  • 做自媒体网站深圳公司名称
  • 免费网站商城模板达州网站建设qinsanw
  • 做电商网站需要多少时间我的世界服务器网站怎么做
  • 淮南企业网站建设网站建设费用主要包括哪些内容
  • 顶棒 技术支持 东莞网站建设临夏做网站
  • 理财p2p网站开发大型门户网站开发
  • 网站系统代码怎么用商河便宜做网站的公司
  • 做电路方案设计的网站承德网站建设步骤
  • 烟台专业网站建设公司国外好用的免费服务器
  • wordpress快速建站教程视频智慧团建登录手机版入口
  • 网站架构模式用哪种旅游网站建设启动方案
  • 任务网站的接口怎么做通辽做网站通过seo来赚钱
  • 杨思网站建设公司学游戏设计去哪个学校
  • 网线制作视频教程企业站seo报价
  • 广州网站开发招聘信息做网站应达到什么效果
  • 网站改版效果图怎么做河北邯郸封闭最新消息
  • 注册或者浏览社交类网站时不恰当华为建站模板
  • 做内贸注册什么网站艺术字生成器在线制作
  • 网站流量和带宽静态html网站打包成exe
  • 网站空间是啥什么叫国际互联网
  • 网站备案属于公司哪一块免费制作app的手机软件
  • 关于协会网站建设的几点思考做网站购买服务器吗
  • 重庆顶呱呱网站建设咸宁抖音seo收费标准
  • 合肥做网站cnfgseo是干嘛的
  • 创建网站的ip地址怎么获得dell公司网站建设的特点
  • 做瞹瞹嗳视频网站在线观看吉林省建设厅安全证查询网站
  • 如何用服务器建设网站抖音小程序开放平台
  • 廊坊网站群发关键词seo结算系统