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
            }
  • 相关阅读:
    程序员指引之路
    RPC 远程过程调用浅谈
    坑爹问题总结
    java 中无符号和有符号int的区别以及byte转int
    python学习Day19 1.产生随机数random、2.序列化【json、 pick、shelve】、3.加 密【hashlib 、hmac】 4.文件的操作【shutil】
    python学习Day18 导包、时间模块【time、calendar datetime】、SYS、OS, OS.path模块、项目开放周期&规范
    python学习Day17 五项【导模块的细节:(跨文件导入模块 &模块的两种执行方式) | 包的概念与使用 | 包中的相对导入语法】
    python学习Day16 模块的概念、模块的导入方式【import 模块名、from 模块 imoprt 功能】、模块的搜索路径、链式导入&循环导入
    python学习Day15 生成器send方法、递归、匿名函数、内置函数
    python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器及生成表达式
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2410191.html
Copyright © 2011-2022 走看看