C#:多进程开发,控制进程数量

正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下:

System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew(
                        (object mystate) =>
                        {
                            Process process = Process.Start("AutoCollectMrMultipleProcess.exe", mystate.ToString());
                            process.WaitForExit();
                        }
                       , collectPathItems.Dequeue())

使用c#中的Process开启线程,并运行一个c#编译的一个Console的业务工程,Console.exe通过接收参数决定并行进程中的每个进程处理具体的任务:例如,实现一个多进程下载,传递给每个进程.exe的参数就是待采集的路径。

一般开辟的进程任务数也是要有限制的开,比如开辟进程数与计算机内核数一样Enviroment.ProcessCount。那么问题来了

问题一:如何在一个c#业务代码确保同时运行的进程数量确保尽量都是最大进程数呢?

假设:我们有25个带下待的任务,有的任务是1个小时左右才能完成、有的10分钟就完成了,如何确保一个完整的业务代码中去确保10分钟完成后,发现当前的进程数还未达到最大数,而且还有待处理任务,就继续开辟新的下载进程任务。

问题二:上边提到的进程最大数,也包含计算机中其他用户开辟的进程数。

假设用A:已经开辟了3个AutoCollectMrMultipleProcess.exe,用户B去进行自己的采集任务时,允许开辟的进程数为:Enviroment.ProcessCount-3(如果该值已经小于等于0,就不再开辟,进入等待)。

问题三:如何确保业务处理是同步的。

实现代码:

            int maxProcessCount = Enviroment.ProcessCount;
            List<System.Threading.Tasks.Task> taskItems = new List<System.Threading.Tasks.Task>();
            Queue<string> collectPathIetms=new Queue<string>();            // 初始化下载任务记录start            。。。            // 初始化下载任务记录end
            int cursor = 0;
            while (!(collectPathItems.Count == 0 && taskItems.Count == 0))
            {
                foreach (System.Threading.Tasks.Task taskItem in new List<System.Threading.Tasks.Task>(taskItems))
                {
                    if (taskItem.Status == System.Threading.Tasks.TaskStatus.Canceled
                        || taskItem.Status == System.Threading.Tasks.TaskStatus.Faulted
                        || taskItem.Status == System.Threading.Tasks.TaskStatus.RanToCompletion)
                    {
                        taskItems.Remove(taskItem);
                    }
                }

                // 如果collectPathItems.Count == 0,则不会有新的任务被添加进来,因此不需要执行下边其他代码。
                // 而只需要等待上边的任务完成跳出循环即可。
                if (collectPathItems.Count == 0)
                {
                    Thread.Sleep(5 * 60 * 1000);
                    continue;
                }

                Process[] processItems = Process.GetProcessesByName("AutoCollectMrMultipleProcess");
                if (processItems.Length >= maxProcessCount)
                {
                    Thread.Sleep(5 * 60 * 1000);
                    continue;
                }

                int dequeueCount = ((maxProcessCount - processItems.Length) > collectPathItems.Count) ? collectPathItems.Count : (maxProcessCount - processItems.Length);

                for (int i = 0; i < dequeueCount; i++)
                {
                    taskItems.Add(System.Threading.Tasks.Task.Factory.StartNew(
                        (object mystate) =>
                        {
                            Process process = Process.Start("AutoCollectMrMultipleProcess.exe", mystate.ToString());
                            process.WaitForExit();
                        }
                       , collectPathItems.Dequeue())
                       );
                }
                                // sleep 30 seconds...
                Thread.Sleep(30 * 1000);
                cursor++;
            }
时间: 2024-10-21 20:31:06

C#:多进程开发,控制进程数量的相关文章

nginx源码分析--高性能服务器开发 常见进程模型

1.高性能服务器 对一个高性能服务器来说,处理速度快和资源占用小是典型特性,尤其是当服务器遇到C10K问题的时候(网络服务器在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题).要做到处理速度足够快,其并发模型的设计相当关键,而要做到资源尤其是内存资源的占用少,就要依赖于其资源分配和资源管理的方案设计. 服务器的并发模型设计是网络编程中很关键的一个部分,服务器的并发量取决于两个因素,一个是提供服务的进程数量,另外一个是每个进程可同时处理的并发连接数量.相应的,服务器

PHP高性能开发-多进程开发

硬件多核时代的软件业以前计算能力的提升一直在摩尔定律的指引下,沿着提升CPU时钟频率这条道路前进,从初期的几十MHz到如今的几GHz.但是,进入2002年以 来,CPU提升主频的困难越来越大,因为主频的提升带来了散热和功耗的大幅增加等问题.几年前,英特尔和AMD都调整了研究方向,开始研究在同一CPU中 放置多个执行内核. 尽管多核是一种硬件技术,但硬件和软件是相互依存的,硬件只是一种物质基础,只有有了软件的支持,才能使硬件拥有用武之地.如今,多核的优势已成共识:一在于“降低功耗”,解决了以往靠主

Linux系统开发7 进程关系,守护进程

[本文谢绝转载原文来自http://990487026.blog.51cto.com] <大纲> Linux系统开发7  进程关系守护进程 终端 网络终端 Linux PCB结构体信息 进程组 修改子进程.父进程的组ID 会话组 设置一个会话脱离控制终端 生成一个新的会话 守护进程 守护进程模板 获取当前系统时间  终端 在UNIX系统中用户通过终端登录系统后得到一个Shell进程这个终端成为Shell进 程的控制终端Controlling Terminal在讲进程时讲过控制终端是保存在PCB

查看,控制进程

程序:程序是保存在外部存储介质(如硬盘)中的可执行代码和数据的静态集合 进程:进程是运行在CPU及内存中出于动态执行状态的计算机程序,每个程序启动后可以创建多个进程 例如web,大量用户同时访问是,httpd服务会创建多个进程来提供服务 1.查看进程 (1.ps命令:查看静态的进程统计信息(ProcessesStatistic) a:显示当前终端下的所有进程,包括其他用户的进程,与x选项结合是将显示系统中左右的进程信息 u:使用以用户为主的格式输出进程信息 x:显示当前用户所有终端下的进程信息

linux应用开发-守护进程

linux应用开发-守护进程 linux应用开发-守护进程 一 守护进程 默认的后台运行的进程 二 与安卓的服务相关联 三 守护进程编写 1 脱离控制终端tty,让父进程为init 2 禁止进程重新打开控制终端 3 重新开启会话setsid(); 4 关闭打开的文件描述符,进程从创建它的父进程哪里继承了打开的文件描述符 ,若不关闭,将会造成资源浪费,造成进程所在的文件系统无法卸下以及引起无法预料的错误 可以使用for循环关闭 for (i = 0 ; i < 文件描述符的个数; i++) { c

Python多进程并发操作中进程池Pool的应用

  在利用Python进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间.当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,10几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,这时候进程池Pool发挥作用的时候就到了.      Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满, 那么就会创建一个新的进程用来执行该请求:但如果池中的进

ArcGIS 缓存技巧[1] 设置发布缓存的进程数量

1.选择服务 假设:我们的地图服务已经发布好,名称为 test.如下图所示: 1.1.2 - 设置发布缓存的进程数量 右键上图 test 服务,先停止服务,选择服务属性(service property)->选择"池化"选项卡. 如下图所示,我们设置最大实例数即可,理论上讲最优是 cpu 线程数+1:但服务器上一般还有其他应用,一般比 cpu 线程数少几个,影响不大.

线程的学习-1,控制线程数量,模仿的

学会了控制线程数量,目前感觉使用c#5.0的新特性灵活性不如之前的线程使用,所以不是很喜欢用新特性,不过也可能是我还没熟悉,等以后熟悉清楚了,再评价好不好,今天先搞一搞控制线程数量 public class TaskTest { public void Test() { List<Task> list = new List<Task>(); TaskFactory taskFactory = new TaskFactory(); for (int i = 0; i < 100

shell的单、多、控制进程

shell的单.多.控制进程的使用方法 一.100个任务使用200秒(普通完成) cat process2.sh  #!/bin/bash function aaa ()  {  start=`date "+%s"`  for ((i=1;i<=100;i++))  do  echo test;sleep 2  done end=`date "+%s"`  echo "time:`expr $end - $start`"  }  aaa