python3 多线程队列 任务百分比_基于多线程任务队列执行时间测试——泛型单例模式落地...

本文介绍了一个使用泛型单例模式来记录多线程任务队列执行时间的方法。通过创建一个全局的单例实例,在任务开始时记录开始时间,任务结束时计算并输出总耗时。这种方法适用于跨线程共享数据,且能适应不同数据类型的场景。
摘要由CSDN通过智能技术生成

目录

基于多线程任务队列执行时间测试——泛型单例模式落地

1.需求

比如有100个任务,多线程异步执行,统计执行完所有任务所耗费的时间。如,开始线程是线程A,最后的线程是B,记录B的DataTime.Now-A的DataTime.Now.

2.遇到的问题

因为这里涉及到多线程,异步,所以需要在最后一个任务线程判断是否执行完。跟任务开始的线程肯定不属于同一个线程。相当于要在不同线程里记录传递变量。

3.解决思路

需要有个全局的单例来记录A开始的DateTime.Now。然后在B中取当前时间减去A的开始时间,即为面向内存级别的任务队列的执行时间。

4.具体代码

4.1泛型单例

因为开始时间是DataTime类型,而且考虑到以后单例会用到各种类型,所以这里用泛型去实现。namespace Singleton

{

/**

/// 泛型实现单例模式

///

/// 需要实现单例的类

public class Singleton where T : new()

{

/**

/// 返回类的实例

///

public static T Instance

{

get { return SingletonCreator.instance; }

}

class SingletonCreator

{

internal static readonly T instance = new T();

}

}

}

4.2 开始时间实体

startTime.cspublic class StartTime

{

private DateTime _time;

public StartTime()

{

_time = DateTime.Now;

}

public string Time

{

get { return _time.ToString(); }

}

}

4.3 实例化单例

在主线程中,调用6W个任务之前实例化单例。 var _startTime = Singleton.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());

_oldQueue.TrySetResult(true);

_isQueueRunning = false;

var TaskTime = DateTime.Now - Convert.ToDateTime(Singleton.Instance.Time);

Console.WriteLine("任务所用时间 " + TaskTime);

}

5.小结

5.1 本文提供了单例模式实际应用中的一次落地;

5.2 单例模式适用于全局不变的实例;

5.3 泛型实现单例,适用于不同的数据类型实例;

5.4 单例可以跨线程,内存级别共享。

https://www.cnblogs.com/JerryMouseLi/archive/2019/12/13/12034441.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值