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

厦门网站建设公司名单热狗seo顾问

厦门网站建设公司名单,热狗seo顾问,赣州市铁路建设办公室网站,网站建立策划书目录 进程池 进程池的概念: 手搓进程池: 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念: 定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中…

目录

进程池

进程池的概念:

手搓进程池:

1、创建信道和子进程

2、通过channel控制子进程

3、回收管道和子进程


进程池

进程池的概念:

        定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,直接将进程再放回进程池中继续等待任务;
        如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,进池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行;这样不会增加操作系统的调度难度,还节省了开关进程的时间,也一定程度上能够实现并发效果。

看下图,父进程和子进程之间可以通过管道来交互;

如果管道中没有数据,则worker进程就阻塞等待;master向哪个管道写入就唤醒哪一个子进程来处理任务;

手搓进程池:

1、创建信道和子进程

我们用一个类来录父进程读写端的fd和子进程的id,用vector来存储;

  • 先来创建一个管道(pipe)
  • 管道创建成功后,再创建子进程(fork)
  • 关闭不需要的fd
  • 将信息存储到vector中

可以将上述代码封装到一个函数中,这样比较好看

#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
using namespace std;class channel
{
public:channel(int wfd, pid_t id, const string &name) : _wfd(wfd), childid(id), _name(name){}~channel(){}int getwfd() { return _wfd; }pid_t getid() { return childid; }string getname() { return _name; }private:int _wfd;pid_t childid;string _name;
};void work(int rfd)
{
}void create(vector<channel> &channels, int num)
{for (int i = 0; i < num; i++){int pipfd[2] = {0};int n = pipe(pipfd);pid_t id = fork();if (id == 0){// child --readclose(pipfd[1]);work(pipfd[0]);close(pipfd[0]);exit(0);}// father --writeclose(pipfd[0]);string name = "channel-" + to_string(i);channels.push_back(channel(pipfd[1], id, name));close(pipfd[1]);}}int main(int argc, char *argv[])
{if (argc != 2){cerr << "processnum???" << endl;return 1;}int num = stoi(argv[1]);// 1、创建子进程和信道vector<channel> channels;create(channels, num);for (auto channel : channels){cout << channel.getid() << " " << channel.getwfd() << " " << channel.getname() << endl;}}

运行结果:

2、通过channel控制子进程

信道建立好后,下面就是接收主进程给我们的任务就可以了,可是子进程如何接收和识别任务呢?

这里我们可以开一个hpp文件来模拟我们的任务:

.hpp文件是允许声明和实现写到一起的;

 在这个文件中使用函数指针类型来初始化,并且有随机选择任务的函数,执行任务的函数;

#pragma once#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;#define NUM 3
typedef void (*task_t)();task_t tasks[NUM];// 创建任务
void Print()
{cout << "I am Print Task" << endl;
}
void Flush()
{cout << "I am Flush Task" << endl;
}
void Download()
{cout << "I am Download Task" << endl;
}// 初始化
void Loadtask()
{srand(time(nullptr) ^ getpid());tasks[0] = Print;tasks[1] = Download;tasks[2] = Flush;
}void Excutetask(int num)
{if (num < 0 || num > 2)return;tasks[num]();
}int selecttask()
{return rand()%NUM;
}

完成.hpp文件后,在我们的.cpp文件中添加对应的头文件;

  • 随机选择一个任务
  • 选择信道和进程
  • 发送任务----父进程完成write操作,子进程完成read操作

 

运行结果:

3、回收管道和子进程
  • 关闭所有w端
  • wait,回收子进程

完整代码:

#include <iostream>
#include <string>
#include <vector>
#include <unistd.h>
#include "test.hpp"
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;class channel
{
public:channel(int wfd, pid_t id,const string &name) : _wfd(wfd), childid(id), _name(name){}~channel(){}int getwfd() { return _wfd; }pid_t getid() { return childid; }string getname() { return _name; }void closechannel(){close(_wfd);}void wait(){pid_t rid =waitpid(childid,nullptr,0);if(rid>0){cout<<"wair sucess"<<endl;}}private:int _wfd;pid_t childid;string _name;
};void work(int rfd)
{while (true){int command = 0;int n = read(rfd, &command, sizeof(command));if (n == sizeof(int)){Excutetask(command);}}
}void create(vector<channel> &channels, int num)
{for (int i = 0; i < num; i++){int pipfd[2] = {0};int n = pipe(pipfd);pid_t id = fork();if (id == 0){// child --readclose(pipfd[1]);work(pipfd[0]);close(pipfd[0]);exit(0);}// father --writeclose(pipfd[0]);string name = "channel-";name += to_string(i);channels.push_back(channel(pipfd[1], id, name));}
}int selectchannel(int num)
{static int index = 0;int next = index;index++;index %=num;return next;
}
void send(int selectnum, int channel_index, vector<channel> &channels)
{write(channels[channel_index].getwfd(), &selectnum, sizeof(selectnum));
}void controlonce(vector<channel> &channels)
{// 2.1、选一个任务int selectnum = selecttask();// 2.2、选一个信道和进程int channel_index = selectchannel(channels.size());// 2.3、发送---父进程w,子进程rsend(selectnum, channel_index, channels);cout << "信息发送成功" << endl;
}
void control(vector<channel> &channels, int times = -1)
{if (times > 0){while(times--){controlonce(channels);}}else{while (true){controlonce(channels);}}
}void clean(vector<channel> &channels)
{for(auto channel:channels){channel.closechannel();}for(auto channel:channels){channel.wait();}
}int main(int argc, char *argv[])
{if (argc != 2){cerr << "processnum???" << endl;return 1;}int num = stoi(argv[1]);Loadtask();// 1、创建子进程和信道vector<channel> channels;create(channels, num);// for (auto channel : channels)// {//     cout << channel.getid() << " " << channel.getwfd() << " " << channel.getname() << endl;// }// 2、通过channel控制子进程control(channels, 10);//3、回收管道和子进程clean(channels);
}

以上就是进程池的知识点,希望有所帮助!!!

http://www.yayakq.cn/news/94766/

相关文章:

  • 网站开发时浮动框的代码济南突然宣布
  • 建网站英语wordpress主题机制
  • 网站开发的后端湖南正规竞价优化公司
  • 山东建设厅网站 高英网站备案系统源码
  • 怎样做化妆品网站关于网站建设的博客
  • 制作网站的软件下载找工程项目上哪个平台好呢
  • seo网站关键词优化方法渭南建筑工程网
  • 淘宝网站的建设目标是海报模板图片
  • 网站为什么做静态做地方门户网站不备案可以吗
  • 门户网站建设方案 模板网易蜂巢 wordpress
  • 好看的ui界面郑州互联网seo使用教程
  • 西安网站开发建设wordpress腾讯地图插件
  • 营销型网站郭老师案例分享宁波网站建设企业网站制作
  • 网站建设案例单招网消防维保公司宣传册设计样本
  • 宁波市省网站建设自设计网站
  • 常州网站建设常州免费网站注册免费网站申请
  • 家居饰品网站建设论文wordpress模版 使用教程
  • 装修公司合作平台的网站php体育网站模板
  • 本地网站怎么做成都网站建设推来客
  • 响水建设局网站wordpress网店
  • 建设旅游网站系统怎么把html文件生成网址
  • 南阳哪里做网站比较好可信网站认证 技术支持单位
  • 企业网站建设综合实训心得体会一千字建设我们的网站教案
  • 网站建设 今晟网络域名解析管理网站
  • 网站定制开发四大基本原则在手机上怎么做app软件
  • 湖南网站开发 d岚鸿铁岭网站开发
  • 国外网页设计分享网站网站个性化制作
  • 学做网站的视频教学建站网站多少钱
  • 安卓网站开发视频织梦文章title怎么显示网站title
  • 怎么利用网站做产品推广分销系统开发公司