基于多线程任务队列执行时间测试——泛型单例模式落地
程序员文章站
2022-05-18 19:29:17
基于多线程任务队列执行时间测试——泛型单例模式落地 [toc] 1.需求 比如有100个任务,多线程异步执行,统计执行完所有任务所耗费的时间。如,开始线程是线程A,最后的线程是B,记录B的DataTime.Now A的DataTime.Now. 2.遇到的问题 因为这里涉及到多线程,异步,所以需要在 ......
目录
基于多线程任务队列执行时间测试——泛型单例模式落地
1.需求
比如有100个任务,多线程异步执行,统计执行完所有任务所耗费的时间。如,开始线程是线程a,最后的线程是b,记录b的datatime.now-a的datatime.now.
2.遇到的问题
因为这里涉及到多线程,异步,所以需要在最后一个任务线程判断是否执行完。跟任务开始的线程肯定不属于同一个线程。相当于要在不同线程里记录传递变量。
3.解决思路
需要有个全局的单例来记录a开始的datetime.now。然后在b中取当前时间减去a的开始时间,即为面向内存级别的任务队列的执行时间。
4.具体代码
4.1泛型单例
因为开始时间是datatime类型,而且考虑到以后单例会用到各种类型,所以这里用泛型去实现。
namespace singleton { /**//// <summary> /// 泛型实现单例模式 /// </summary> /// <typeparam name="t">需要实现单例的类</typeparam> public class singleton<t> where t : new() { /**//// <summary> /// 返回类的实例 /// </summary> public static t instance { get { return singletoncreator.instance; } } class singletoncreator { internal static readonly t instance = new t(); } } }
4.2 开始时间实体
starttime.cs
public class starttime { private datetime _time; public starttime() { _time = datetime.now; } public string time { get { return _time.tostring(); } } }
4.3 实例化单例
在主线程中,调用6w个任务之前实例化单例。
var _starttime = singleton<starttime>.instance.time; console.writeline("开始时间 " + _starttime ); for (int i=0;i<=60000;i++){ int wait=rnd.next(1,10) * 1000; var parm=new myparameters{delaytime= 2000, jobno=i}; obj.queue(futuretask: async ()=>{await runmyjob(parm); }); }
4.4 获取任务结束时间
最后一个任务结束时,获取当前时间,再减去单例的任务开始时间即可。
if (_processingqueue.isempty && _runningtasks.isempty) { // interlocked.exchange might not be necessary var _oldqueue = interlocked.exchange( ref _tscqueue, new taskcompletionsource<bool>()); _oldqueue.trysetresult(true); _isqueuerunning = false; var tasktime = datetime.now - convert.todatetime(singleton<starttime>.instance.time); console.writeline("任务所用时间 " + tasktime); }
5.小结
5.1 本文提供了单例模式实际应用中的一次落地;
5.2 单例模式适用于全局不变的实例;
5.3 泛型实现单例,适用于不同的数据类型实例;
5.4 单例可以跨线程,内存级别共享。
下一篇: 性能调优 -- TPS&QPS