从别处找来的,记一下,学习~
/*=============================================================================
#
# Description: 多进程的一个框架,大家可以直接使用,已经经过功能测试和压力测试。
# 编译:g++ forkwork_use.cpp -o forkwork_use
#
=============================================================================*/
#include <iostream>
#include <pthread.h>
#include <string>
#include <vector>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <map>
using namespace std;
//=============================================================================
typedef std::pair<pid_t,int> pidPair;
map<pid_t,int> g_MapPids;
int DoYourWork(int iIndex);
/**
* @brief 检查子进程情况(不需要改动)
*
* @param bNeedCon true:父进程发现子进程死掉就会重新拉起子进程;false:父进程在所有子进程都退出之后也会退出。
*
* @return 0 succ
* else fail
*/
int DetectPids(bool bNeedCon)
{
pid_t pid;
pid_t _n_pid;
int Ret;
for(;;)
{
//会阻塞在这里,等待有子进程退出
pid = waitpid(-1,NULL,0);
if ( pid < 0 )
{
sleep(1);
continue;
}
if(!bNeedCon)//等待结束
{
g_MapPids.erase(pid);
if(g_MapPids.size()==0)
return 0;
}
else//检测拉起
{
if(g_MapPids.count(pid)<=0)
{
sleep(1);
continue;
}
int index=g_MapPids.find(pid)->second;
g_MapPids.erase(pid);
_n_pid = fork();
if(_n_pid<0)
{
sleep(1);
continue;
}
else if ( _n_pid == 0 )
{
printf("i am child\n");
g_MapPids.clear();
Ret = DoYourWork(index);
return Ret;
}
else
{
printf("i am farther,child is %d,index is %d\n",_n_pid,index);
g_MapPids.insert(pidPair(_n_pid,index));
}
sleep(1);
}
}
return 0;
}
/**
* @brief 执行启动多个子进程的逻辑(不需要改动)
*
* @param forknum 子进程个数
* @param bNeedCon true:父进程发现子进程死掉就会重新拉起子进程;false:父进程在所有子进程都退出之后也会退出。
*
* @return 0 succ
* else fail
*/
int ForkWork(int forknum,bool bNeedCon)
{
g_MapPids.clear();
pid_t pid=0;
int Ret;
for(int i=0;i<forknum;++i)
{
pid=fork();
if(pid==-1)
return -1;//err
else if(pid==0)//child
{
//执行
printf("i am child\n");
g_MapPids.clear();
Ret = DoYourWork(i);
return Ret;
}
else
{
printf("i am farther,child is %d,index is %d\n",pid,i);
g_MapPids.insert(pair<pid_t,int>((pid_t)pid,(int)i));
}
}
printf("start all pids and start detect\n");
DetectPids(bNeedCon);
return 0;
}
/**
* @brief 用户需要执行的函数(需要用户实现)
*
* @param iIndex 给这个进程分配一个userId,存储在父进程的pid->userId的映射表里;主要目的是为了实现当子进程自己死掉,父进程可以重新根据map表传入这个userId
*
* @return 0 succ
* else fail
*/
int DoYourWork(int iIndex)
{
//do your own thing
sleep(5);
return 0;
}
int main(int argc,char ** argv)
{
if(argc < 2)
{
printf("please input maxforknum needCon(0/1)\n");
printf("eg. ./forkwork_use 10 1\n");
return 0;
}
int iForkNum=atoi(argv[1]);
bool bNeedCon=atoi(argv[2]);
ForkWork(iForkNum,bNeedCon);
}
分享到:
相关推荐
多进程服务的框架源代码示例,需要的朋友可以下载
人工智能-项目实践-嵌入式-基于Linux系统的应用程序,旨在搭建一套完整的多进程多线程通讯的消息框架. 支持多SOC的嵌入 架构设计核心思想: 统一、抽象、下沉、上升、量化、闭环。 统一:做到通用,标准化,如posix...
一个进程级别的python并行框架,可用于深度学习调参等任务,可通过 pip install MultiRunner 安装
python
一个基本AnnotationProcessor实现的多进程路由框架。支持注解注册接口、多进程间数据交互。可快速应用于多进程模块化,所有进程间的请求为同步调用。
Python3爬虫系列的理论验证,比较同步依序下载、多进程并发、多线程并发和asyncio异步编程之间的效率差别
三年来一直从事服务器程序开发,一直都是忙忙碌碌,不久前结束了职业生涯的第一份工作,有了一个礼拜的休息时间,终于可以写写总结了。于是把以前的开源代码做了整理和优化,这就是FFLIB。虽然这边总结看起来像日记...
多进程程序的编写相比较多线程编写更加复杂,需要考虑进程回收、同步、互斥、通信等问题。对于初学者来说,处理上述问题会比较困难。 尤其是信号处理和进程通信这块,很难做到不出问题。 SimpleFork提供一套类似于...
基于java游戏服务器框架,它是高可伸缩、分布式多进程的游戏服务器框架。
基于swoole一款高性能多进程常驻内存型全栈框架,内置WebSocket服务器、服务治理PhpRpc功能,不依赖传统的 PHP-FPM,可以用于构建高性能的Web系统、API、中间件、基础服务等等。 软件开发设计:PHP、应用软件开发、...
与某些Android插件框架不同,Atlas是一个组件框架(我们称为Bundle),而Atlas不是一个多进程框架。 您可以看到该项目中有三个主要库( / / ) :这是客户端核心库,它的工作是安装每个捆绑软件,并
这是一个有关于共享内存得多进程交互得小项目,它涉及到进程锁和单一文件夹的简易Makefile得编写,其中这只是一个框架,将多进程如何利用共享内存得方式进行数据得交互。其中是在共享内存得方式,需要进行加锁操作...
Beanbun 是用 PHP 编写的多进程网络爬虫框架,具有良好的开放性、高可扩展性,基于 Workerman。
python 高性能,高并发,轻量级,多进程,多线程,异步非阻塞网络开发框架。适用linux 下 python 2.6-2.7版本(不能用于windows,因为用了select.epoll ) 4w/qps 单进程,及多进程DEMO from pyndk.CCommMgr import *...
taskPHP基于php开发的定时计划任务框架,多进程实现任务的分配和运行,支持多进程和多线程模式需要安装pthreads扩展(可选),支持linux和windows。
更主要是 讨论在多进程环境下如何使用logging 来输出日志, 如何安全地切分日志文件。 1. logging日志模块介绍 python的logging模块提供了灵活的标准模块,使得任何Python程序都可以使用这个第三方模块来实现日志...
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...
workerman是一个高性能的PHP socket服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。...
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。 Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,...