正在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 = ;
while (!(collectPathItems.Count == && taskItems.Count == ))
{
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 == )
{
Thread.Sleep(3 * );
continue;
} Process[] processItems = Process.GetProcessesByName("AutoCollectMrMultipleProcess");
if (processItems.Length >= maxProcessCount)
{
Thread.Sleep(3 * );
continue;
} int dequeueCount = ((maxProcessCount - processItems.Length) > collectPathItems.Count) ? collectPathItems.Count : (maxProcessCount - processItems.Length); for (int i = ; 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(3 * );
cursor++;
}

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

  1. curl命令,curl实现post,curl监控网页shell脚本,curl多进程实现并控制进程数,

    cURL > Docs > Tutorial:  http://curl.haxx.se/docs/httpscripting.html 下载单个文件,默认将输出打印到标准输出中(STDO ...

  2. python 多进程开发与多线程开发

    转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文:  博文1  博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...

  3. python自动化开发学习 进程, 线程, 协程

    python自动化开发学习 进程, 线程, 协程   前言 在过去单核CPU也可以执行多任务,操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换任务2,任务2执行0.01秒,在切换到任务3,这 ...

  4. Node.js - 阿里Egg的多进程模型和进程间通讯

    前言 最近用Egg作为底层框架开发项目,好奇其多进程模型的管理实现,于是学习了解了一些东西,顺便记录下来.文章如有错误, 请轻喷 为什么需要多进程 伴随科技的发展, 现在的服务器基本上都是多核cpu的 ...

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

    硬件多核时代的软件业以前计算能力的提升一直在摩尔定律的指引下,沿着提升CPU时钟频率这条道路前进,从初期的几十MHz到如今的几GHz.但是,进入2002年以 来,CPU提升主频的困难越来越大,因为主频 ...

  6. Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...

  7. Python多进程并发操作进程池Pool

    目录: multiprocessing模块 Pool类 apply apply_async map close terminate join 进程实例 multiprocessing模块 如果你打算编 ...

  8. 主键生成器效率提升方案|基于雪花算法和Redis控制进程隔离

    背景 主键生成效率用数据库自增效率也是比较高的,为什么要用主键生成器呢?是因为需要insert主表和明细表时,明细表有个字段是主表的主键作为关联.所以就需要先生成主键填好主表明细表的信息后再一次过在一 ...

  9. go中控制goroutine数量

    控制goroutine数量 前言 控制goroutine的数量 通过channel+sync 使用semaphore 线程池 几个开源的线程池的设计 fasthttp中的协程池实现 Start Sto ...

随机推荐

  1. SSM 使用 mybatis 分页插件 pagehepler 实现分页

    使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,比写一段完整的分页sql代码,也能减少了误差性. Mybatis分页插件 demo 项目地址:https://gitee.com/fre ...

  2. Spring boot(4)-应用打包部署

    1.Spring Boot内置web spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动.其内置Tomcat容器或Jetty容器,具体由配置来决定 ...

  3. linux --> 获取进程执行时间

    获取进程执行时间 一.时间概念 在linux下进行编程时,可能会涉及度量进程的执行时间.linux下进程的时间值分三种: 时钟时间(real time):指进程从开始执行到结束,实际执行的时间. 用户 ...

  4. Matlab绘图基础——colormap的使用

    **使用系统内置的colormap** ``` syms x y ezmesh(x*exp(-x^2-y^2),[-2.5,2.5],40) colormap(hot) ``` 自定义colormap ...

  5. c语言程序设计第6周编程作业一(分解质因数)

    分解质因数 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程 ...

  6. JavaScript(第三十二天)【Ajax】

    2005年Jesse James Garrett发表了一篇文章,标题为:"Ajax:A new Approach to Web Applications".他在这篇文章里介绍了一种 ...

  7. 微信APP简要分析

    Part1 走进微信APP 很明显,微信是很成功的APP. 微信 (WeChat) 是腾讯公司于2011年1月21日推出的一个为智能终端提供即时通讯服务的免费应用程序,现已是超过九亿人使用的手机应用. ...

  8. 敏捷冲刺(Beta版本)

    评分基准: 按时交 - 有分(计划安排-10分,敏捷冲刺-70分),检查的项目包括后文的三个个方面 冲刺计划安排(单独1篇博客,基本分5分,根据完成质量加分,原则上不超过满分10分) 七天的敏捷冲刺( ...

  9. C语言第一次作业——输入输出格式

    题目1温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码 #include& ...

  10. Junit 4 测试中使用定时任务操作

    难度:测试中执行线程操作 package com.hfepc.job.dataCollection.test; import java.util.Date; import java.util.List ...