多任务管理类 MutilTaskManager

计算和计算所需的数据能被较为平均的非配到若干task的时候,下面的任务管理类可以提供在大数据大计算量的情况下非精确的控制task的执行数量来限制计算量和内存占用量.

 

下面是代码(非线程安全版本):

 

复制代码
public class MutilTaskManager
    {
        private readonly int _maxRun;
        private readonly int _maxQuenen;
        private List<Task> _taskRunningList;
        private readonly Queue<Task> _taskQueue;

        public bool IsQueueFull
        {
            get { return _taskQueue.Count > _maxQuenen; }
        }

        public MutilTaskManager(int maxRun = 8int maxQuenen = 2)
        {
            _maxRun = maxRun;
            _maxQuenen = maxQuenen;
            _taskRunningList = new List<Task>(maxRun);
            _taskQueue = new Queue<Task>(2);
        }

        public void TakeBooting(int sleepTime = 10)
        {
            if (_taskRunningList.Count >= _maxRun)
            {
                _taskRunningList = _taskRunningList.Where(it => !it.IsCompleted).ToList();
            }
            while (_taskRunningList.Count < _maxRun && _taskQueue.Count > 0)
            {
                var t = _taskQueue.Dequeue();
                _taskRunningList.Add(t);
                t.Start();
            }
            System.Threading.Thread.Sleep(sleepTime);
        }

        public void Enqueue(Task task)
        {
            _taskQueue.Enqueue(task);
            TakeBooting(0);
        }

        public void WaitAll()
        {
            while (_taskQueue.Count > 0)
            {
                TakeBooting();
            }
            Task.WaitAll(_taskRunningList.ToArray());
        }
    }
复制代码

线程安全版本:

复制代码
public class MutilTaskManager
    {
        private readonly int _maxRun;
        private readonly int _maxQuenen;
        private List<Task> _taskRunningList;
        private readonly Queue<Task> _taskQueue;
        private object _lockObj = new object();
        public bool IsQueueFull
        {
            get { return _taskQueue.Count > _maxQuenen; }
        }

        public MutilTaskManager(int maxRun = 8int maxQuenen = 2)
        {
            _maxRun = maxRun;
            _maxQuenen = maxQuenen;
            _taskRunningList = new List<Task>(maxRun);
            _taskQueue = new Queue<Task>(2);
        }

        public void TakeBooting(int sleepTime = 10)
        {
            lock (_lockObj)
            {
                if (_taskRunningList.Count >= _maxRun)
                {
                    _taskRunningList = _taskRunningList.Where(it => !it.IsCompleted).ToList();
                }
                while (_taskRunningList.Count < _maxRun && _taskQueue.Count > 0)
                {
                    var t = _taskQueue.Dequeue();
                    _taskRunningList.Add(t);
                    t.Start();
                }
            }
            System.Threading.Thread.Sleep(sleepTime);
        }

        public void Enqueue(Task task)
        {
            lock (_lockObj)
            {
                _taskQueue.Enqueue(task);
            }
            TakeBooting(0);
        }

        public void WaitAll()
        {
            while (_taskQueue.Count > 0)
            {
                TakeBooting();
            }
            Task.WaitAll(_taskRunningList.ToArray());
        }
    }
复制代码

 

使用示例:

复制代码
void Test()
        {
            var mtm = new MutilTaskManager();
            foreach(int i in(new int[10]))
            {
                while (mtm.IsQueueFull)
                {
                    mtm.TakeBooting();
                }
                mtm.Enqueue(new Task(myTask));
            }
        }

        void myTask()
        {
            //read data
            
//do something
        }
复制代码

 

 

本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2012/03/21/2410191.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Node.js meitulu图片批量下载爬虫1.051

原有1.05版程序没有断点续传模式&#xff0c;现在在最近程序基础上改写一版1.051. // // meitulu图片批量下载爬虫1.051 // 用最近的断点续传框架改写原有1.05版程序 // 2017年11月21日 //// 内置https模块 var httpsrequire("https");// 内置http模块 var httprequi…

mysql 5.6.4以上版本innodb支持全文索引的测试

对于mysql 5.6.4以上版本innodb支持全文索引的测试 在mysql官网&#xff0c;innodb引擎在5.6.4版本提供了对全文索引的支持&#xff0c;笔者对此做了测试&#xff0c;发现对中文全文检索的支持依然不理想&#xff0c;但却确实提供了对英文的全文支持。 12.9.5 Full-Text Restri…

EMC VMAX的磁盘构成,fast policy(重要)

首先是流程&#xff0c; 不同种类的磁盘&#xff08;sata&#xff0c;fc&#xff0c;flah&#xff09;->disk group->raid->DATA volume->thin pool->TDEV and BCVDEV (lun) 然后细看&#xff1a; 1&#xff09; 不同种类的磁盘叫做disk&#xff0c;这是可见的物…

[精讲-3]Offline Domain Join

从windows 2008 ,windows 7开始起就具备脱机加入域的功能,就是它们在未连接DC的情况下,也可以加入域. 假如环境lab.com ,一台已加入域的PC (WIN7Client) 和即将加入域的PC(win7-2) 在win7client上run下面这个命令 DC已作了一次预先的动作:创建了computer object 在win7-2上,用本…

搭建iscsi存储系统

搭建iscsi存储系统 NAS和SAN服务器概述 NAS网络附属存储&#xff1a; NAS&#xff08;Network Attached Storage)&#xff0c;NAS服务器是连接在网络上&#xff0c;具备资料存储功能的服务器&#xff0c;一种与用数据存储服务器。网络附属存储基于标准网络协议&#xff08;Tcp/…

在Microsoft System Center中利用您的现有投资管理VMware--Veeam MP v6.5

在 Microsoft System Center 中利用您的现有投资管理 VMware VeeamManagement Pack (MP) v6.5 适用于物理、虚拟和备份基础架构的单一的虚拟管理平台 前段时间介绍了Veeam Management Pack (MP) v6.0产品&#xff0c;昨天发布了新版本VeeamManagement Pack (MP) v6.5&#xff0…

SpringMVC注解HelloWorld

今天整理一下SpringMVC注解 欢迎拍砖 RequestMapping RequestMapping是一个用来处理请求地址映射的注解&#xff0c;可用于类或方法上。用于类上&#xff0c;表示类中的所有响应请求的方法都是以该地址作为父路径。 RequestMapping注解有六个属性&#xff0c;下面我们把她分成三…

自制 移动端 纯原生 Slider滑动插件

在Google搜关键字“slider”或“swiper”能找到一大堆相关插件&#xff0c;自己造轮子是为了能更好的理解其中的原理。 给这个插件取名为“veSlider”是指“very easy slider”非常简单的一个滑动插件。 这只是个半成品&#xff0c;仅仅实现了手指滑动、自动轮播、跳转等基本功…

ISA Server 2006 部署步骤

ISA Server 2006 部署步骤 Posted by 尹揆 在这里先把ISA2006的安装步骤给大家贴出来,后面陆续会有一些配置及日常的应用,希望大家多多指教!呵呵.ISA功能的强大自然不用多说了,一句话只要能想到它就能做到!放入光盘出现在我们面前还是其人性化的界面点默认的下一步吧接受协议序…

mysql将查询数据另存

1.查询mysql的存储执行目录&#xff08;secure-file-priv是指定文件夹作为导出文件存放的地方&#xff09;所以需要查询以下&#xff0c;不然会报1290错误 show variables like %secure%;2.查询并转存 SELECT * into outfile C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\zo…

重新捡起flask(三)

记一次bug调试。 本来以为模板这一章可以很快的过掉的&#xff0c;刚刚写完的2其实只剩下个flask-moment时间库了&#xff0c;之前早就做过&#xff0c;记得很简单&#xff0c;本来说只要敲一下代码就结束&#xff0c;没想到&#xff0c;踩坑里去了。 调试bug吗&#xff0c;我想…

远程服务器部署spring boot 项目(centos7为例)

1.打包项目&#xff08;可以是jar包&#xff0c;也可以是war包&#xff09;以jar包为例&#xff08;用eclipse打包&#xff09;&#xff1a;1.项目目录右击--debug as&#xff08;run as&#xff09;--maven build&#xff0c;然后输入package&#xff0c;点击debug&#xff0c…

SIN的服务器配置

统计了新加坡服务器中IBM XIV存储挂载的主机列表。 对于vmware虚拟机来说&#xff0c;是这么组成的&#xff1a; 存储分了多个lun&#xff0c;在os侧叫做data store&#xff0c;多个datastore挂给多个物理机&#xff0c;物理机(安装了esxi软件)称为ESXI主机&#xff0c;多个ESX…

sklearn机器学习实例

原创网址&#xff1a;https://blog.csdn.net/qq_27150893/article/details/80169736 sklearn是非常流行的机器学习库&#xff0c;实现了很多的机器学习模型。官网&#xff1a;http://scikit-learn.org/stable/ 里面有全面的实例和模型参数讲解&#xff0c;用到哪个模型就去官…

CSVDE批量导入域用户

CSVDE批量导入用户 你可以使用Csvde格式的文件在活动目录中创建用户帐号和其他类型的帐号。但你不能使用Csvde删除活动目录中的对象。 使用Csvde命令行工具创建用户帐号&#xff0c;采用下列步骤&#xff1a; 1. 创建Csvde输入文件。文件应包含下列信息。 属性行&#xff1a;这…

【转载】细聊冗余表数据一致性(架构师之路)

本文主要讨论四个问题&#xff1a; &#xff08;1&#xff09;为什么会有冗余表的需求 &#xff08;2&#xff09;如何实现冗余表 &#xff08;3&#xff09;正反冗余表谁先执行 &#xff08;4&#xff09;冗余表如何保证数据的一致性 一、需求缘起 互联网很多业务场景的数据量…

ethtool如何让接口闪灯_如何解决专业家庭影院与卡拉OK的声学问题?

现在越来越多的专业家庭影院走进人们的家中&#xff0c;享受体验娱乐氛围的空间。在实际的生活中&#xff0c;许多人都把这个空间设计为多功能的影音娱乐室&#xff0c;集看电影、听音乐、卡拉OK、游戏娱乐等于一体&#xff0c;在这其中看电影与卡拉OK将这两个功能组合在同一个…

关于MapReduce单词统计的例子:

要统计的文件的文件名为hello hello中的内容如下 hello  you hello  me 通过MapReduce程序统计出文件中的各个单词出现了几次.(两个单词之间通过tab键进行的分割) 1 import java.io.IOException;2 3 import mapreduce.WordCountApp.WordCountMapper.WordCountReducer;4 5 i…

朵朵糖故事机器人怎么更新_“故事贩卖机”专栏创始人温酒的新作,奇幻世界的暖心物语很治愈...

我有酒&#xff0c;你有故事吗&#xff1f;2015年&#xff0c;知乎上一个叫“故事贩卖机”的专栏横空出世&#xff0c;凭着一个个脑洞大开的故事&#xff0c;这个温吞而又温暖的专栏很快得到了读者的认可。而其中的创始人兼主打写手温酒&#xff0c;更是被粉丝们亲切地称呼为“…

使用dropwizard(3)-加入DI-dagger2

前言 习惯了Spring全家桶&#xff0c;对spring的容器爱不释手。使用dropwizard&#xff0c;看起来确实很轻&#xff0c;然而&#xff0c;真正使用的时候不得不面临一个问题。我们不可能一个resource就能把所有的业务逻辑囊括&#xff01;那么&#xff0c;必然就要有负责处理逻辑…