`
yuanyu5237
  • 浏览: 162738 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个多进程框架

 
阅读更多

从别处找来的,记一下,学习~

/*=============================================================================
#
#   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);
}
 
分享到:
评论

相关推荐

    多进程服务的框架源代码

    本资源提供的"多进程服务的框架源代码"是一个很好的学习和实践平台,尤其对于那些希望深入理解多进程编程和服务设计的开发者来说。下面将详细探讨多进程、服务以及源代码分析等相关知识点。 首先,我们来理解“多...

    Android-安卓跨进程跨app通信框架

    这个框架的核心目标是提供一个简单易用的API,使得开发者可以轻松地在不同的Android应用之间传递数据和执行操作。它通常会包含以下几个关键组成部分: 1. **Binder机制**:Android的跨进程通信基础是Binder机制。...

    python 实现的多进程 socket通讯框架,支持多进程进行发送和接收

    将多进程与Socket结合,我们可以创建一个多进程Socket服务器,每个连接由一个新的进程处理。`multiprocessing`模块的`Pool`类可以方便地管理一组进程,处理任务。例如: ```python from multiprocessing import ...

    Python-一个进程级别的python并行框架

    在处理大量数据或执行计算密集型任务时,利用多进程并行处理可以显著提高效率。"Python-一个进程级别的python并行框架" 提供了这样的解决方案,允许用户在进程层面并行运行任务,特别适合于深度学习的参数调整等耗时...

    基于PHP的多进程定时任务框架设计源码

    taskPHP是一个基于PHP的多进程定时任务框架,采用多进程技术实现任务的高效分配和执行。该项目支持多进程和多线程模式,推荐安装pthreads扩展以获得更佳性能,同时兼容Linux和Windows操作系统。项目包含39个文件,...

    多进程窗口嵌套

    多进程意味着同时运行着多个这样的执行实例,每个实例可能在执行不同的任务或者协同完成一个复杂的系统功能。 在Windows或类似的GUI(图形用户界面)系统中,“窗口”是用户与应用程序交互的主要方式。每个窗口都...

    人工智能-项目实践-嵌入式-基于Linux系统的应用程序,旨在搭建一套完整的多进程多线程通讯的消息框架. 支持多SOC的嵌入

    人工智能-项目实践-嵌入式-基于Linux系统的应用程序,旨在搭建一套完整的多进程多线程通讯的消息框架. 支持多SOC的嵌入 架构设计核心思想: 统一、抽象、下沉、上升、量化、闭环。 统一:做到通用,标准化,如posix...

    duilib多进程浏览器

    多进程架构是现代浏览器的一个核心特性,它将不同的浏览器功能分散到多个独立的进程中,从而避免一个进程崩溃影响整个浏览器。 Duilib是一个开源的Windows界面库,它为开发者提供了一套快速开发高效、美观的Windows...

    QT 多进程通信

    QT框架中的多进程通信是开发复杂应用程序时的关键技术,它允许不同进程之间交换数据和执行协同操作。在本示例中,"QT 多进程通信"着重展示了如何使用QProcess和QSharedMemory来实现进程间的通信。 QProcess是QT库中...

    C#多进程浏览器-仿Chrome浏览器

    "C#多进程浏览器-仿Chrome浏览器"是一个项目,它旨在模仿Google Chrome浏览器的设计理念,利用C#来实现一个支持多进程架构的浏览器。这个项目名为"MultiProcessArchitectureDemo-master",显然关注的是多进程架构这...

    Qt+VTK多进程,VTK窗口进程嵌入主进程

    【Qt+VTK多进程,VTK窗口进程嵌入主进程】这个主题涉及到的是使用Qt框架与Visualization Toolkit(VTK)进行多进程编程,并将VTK的图形窗口集成到Qt的主应用程序中。Qt是一个流行的跨平台应用开发框架,而VTK则是一...

    基于PHP多进程内存共享的定时计划任务框架设计源码

    该项目为基于PHP的多进程内存共享定时计划任务框架设计源码,包含44个文件,涵盖32个PHP脚本、7个Markdown文档、1个JSON配置、1个日志文件、1个数据库文件、1个命令文件、1个模板文件。该框架利用PHP的多进程和内存...

    详解主流浏览器多进程架构:Chrome、IE

    ### 详解主流浏览器多进程架构:Chrome、IE 随着互联网技术的飞速发展,Web浏览器已成为现代生活中不可或缺的一部分。然而,网络安全威胁也随之增加,包括恶意软件、木马、间谍软件等,对用户的安全和隐私构成了...

    Android-MultiProcessRouter可能是最方便的多进程路由框架可快速应用于多进程模块化

    在这种背景下,`Android-MultiProcessRouter`应运而生,它是一个高效、易用的多进程路由框架,特别适用于多进程模块化的应用程序。 `Android-MultiProcessRouter`的核心功能是通过AnnotationProcessor(注解处理器...

    [原创]VB多进程示例程序

    总结起来,这个VB多进程示例程序提供了一个基础框架,展示了如何在VB环境中利用API调用来实现多进程操作,这对于需要并发执行任务或需要独立运行组件的VB开发者来说是非常有价值的参考资料。通过学习和理解这个示例...

    基于PHP写的高并发服务器框架,支持websocket和http协议 采用多进程+IO复用提高并发处理能力

    采用多进程+IO复用提高并发处理能力 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:用PHP写的高并发服务器框架,支持...

    qt例程14.多进程爬虫.7z

    Qt是一个跨平台的C++图形用户界面应用程序开发框架,而多进程爬虫则是一种并行处理策略,能够提升爬虫的抓取速度和效率。 首先,让我们深入理解Qt库。Qt提供了丰富的API,可以用于创建GUI应用、网络通信、数据库...

    Python-Python3爬虫系列的理论验证比较同步依序下载多进程并发多线程并发和asyncio异步编程之间的效率差别

    本主题将深入探讨Python3中四种不同的并发模型:同步依序下载、多进程(multiprocessing)、多线程(multithreading)以及asyncio异步编程,并通过理论分析和实际案例对比它们之间的效率差异。 1. 同步依序下载: ...

    轻量级进程间通信框架,基于 Messenger 实现 进程间传递数据不错的选择

    这样可以提高应用的响应性和稳定性,因为即使一个进程崩溃,另一个进程仍然可以继续运行。例如,一个后台服务可以在单独的进程中执行耗时任务,而UI进程则保持流畅,两者通过Messenger交换信息。 总结来说,基于...

    多进程编程卡死解决方案

    在多进程环境中,如果一个进程(如后台计算进程)在主线程上执行耗时操作,那么UI更新就会被阻塞,造成用户界面无响应。解决这一问题的关键在于将计算密集型任务移到单独的进程中执行,让主线程专注于处理用户界面...

Global site tag (gtag.js) - Google Analytics