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

常州建设局网站打不开17网站一起做网店登录

常州建设局网站打不开,17网站一起做网店登录,网站如何做页数,网络运营有前途吗目录 进程池 进程池的概念#xff1a; 手搓进程池#xff1a; 1、创建信道和子进程 2、通过channel控制子进程 3、回收管道和子进程 进程池 进程池的概念#xff1a; 定义一个池子#xff0c;在里面放上固定数量的进程#xff0c;有需求来了#xff0c;就拿一个池中…目录 进程池 进程池的概念 手搓进程池 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(vectorchannel 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、创建子进程和信道vectorchannel 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(rid0){coutwair sucessendl;}}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(vectorchannel 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, vectorchannel channels) {write(channels[channel_index].getwfd(), selectnum, sizeof(selectnum)); }void controlonce(vectorchannel 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(vectorchannel channels, int times -1) {if (times 0){while(times--){controlonce(channels);}}else{while (true){controlonce(channels);}} }void clean(vectorchannel 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、创建子进程和信道vectorchannel 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.pierceye.com/news/192492/

相关文章:

  • 免费建站的手机app专业做网站设计公司价格
  • 江苏宜兴做网站的电话seo基础培训
  • 企业手机端网站模板下载济南公司建站模板
  • 一般公司做网站多少钱南昌市房产网
  • 惠州网站小程序建设做公司永久免费网站什么好
  • 湖南涟钢建设有限公司网站局网站建设工作总结
  • 家乡ppt模板免费下载网站合肥百姓网网站建设
  • 免费整套ppt模板下载网站东莞建设教育网站
  • 漯河网站建设漯河ps制作个人网站首页
  • 电商网站公司软件开发和软件研发
  • 网站建设浙江公司网站开发运营新人要注意什么
  • 外贸网站模板哪里下载家里电脑可以做网站服务器吗
  • 长沙门户网站北京设计网站的公司
  • 站长统计平面设计找工作难吗
  • seo建站公司推荐电商平台活动策划方案
  • 建设淘宝客网站.lc和ev手机对比平台
  • vue 做企业网站特产网站开发背景
  • 奉新网站制作dede视频网站源码
  • 做动画网站去哪采集建设网站需要的资金清单
  • 网站后台发邮件注册公司需要什么证件和手续
  • 炫酷特效网站万网虚拟主机免费空间
  • 公司网站模板最新怀远网站建设哪家好
  • 交互式网站定义如何网上找加工订单
  • 一个域名可以做几个网站吗南城网站建设公司
  • 宝安商城网站建设flash新手入门简单动画制作
  • 设置网站建设WordPress adsen
  • 网站与微信内容建设与运维总结建筑网络图
  • 网站模板文件不存在网站建设礻金手指下拉十二
  • 东莞浩智建设网站公司做百度推广员赚钱吗
  • qq网站推广代码昆明哪里做网站