zoukankan      html  css  js  c++  java
  • 多任务管理类 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
            }
  • 相关阅读:
    数据仓库基础(十四)缓慢变化维
    数据仓库基础(十三)Informatica workflow
    数据仓库基础(十二)Informatica组件(2)
    数据仓库基础(十一)Informatica小技巧(2)
    数据仓库基础(十)组件1
    数据仓库基础(九)Informatica小技巧(1)
    数据仓库基础(八)Informatica 小例子
    数据仓库基础(七)Informatica PowerCenter介绍
    数据仓库基础(六)数据的ETL
    数据仓库基础(五)数据仓库系统应用实例
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2410191.html
Copyright © 2011-2022 走看看