当前位置:网站首页>解决new Thread().Start导致高并发CPU 100%的问题
解决new Thread().Start导致高并发CPU 100%的问题
2022-08-01 09:35:00 【dotNET跨平台】
背景
之前接手一个项目的时候,发现到处是
new Thread(()=>{
//do something
}).Start();
这么做的目的,无非是为了减少页面等待时间提高用户体验,把一些浪费时间的操作放到新线程中在后台运行。
问题
但是这样带来的问题是大量的创建线程,非常影响项目的性能,尤其是在一些大并发量访问的时候,经常导致后果是cpu 100%。
当然,如果你的项目到处是这样写的,然后,没挂,至少说明这个方法没几个人再用。
解决方法
于是下意识的想着给项目优化下, 第一想法是走队列,但是发现项目压根没有使用队列,很多操作还停留在 有个任务表,有任务的时候,往里面加内容,然后有个定时任务,每分钟执行一次,定时的去消费任务;
于是想着怎么先最少的改动,先把问题解决,后面的事情在做考虑。
其实问题的本质是new 太多Thread了,那么最简单的方法就是限制数量。
于是 ThreadPool.QueueUserWorkItem就登场了。
对于线程队列 ThreadPool.QueueUserWorkItem 很多人应该都不陌生,下边看微软的解释:
将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
方法如下
protected static Logger Logger = LogManager.GetCurrentClassLogger();
public ActionResult Index()
{
// Logger.Debug("执行了 开始 ");
ThreadPool.QueueUserWorkItem(new WaitCallback(InsertNewsInfoExt), "param");
// Logger.Debug("执行了 结束 ");
return View();
}
private void InsertNewsInfoExt(object info)
{
// Logger.Debug("执行了 InsertNewsInfoExt 开始");
Thread.Sleep(1000*200);
Logger.Debug("执行了 InsertNewsInfoExt 结束 ");
new Thread(t =>
{
try
{
Logger.Debug("执行了 Thread ");
}
catch (Exception ex)
{
Logger.Error(ex.Message);
}
}).Start();
}
根据msdn描述:线程池的默认大小为每个可用处理器有 25 个线程。使用 SetMaxThreads 方法可以更改线程池中的线程数
//工作者线程最大数目,I/O线程的最大数目
ThreadPool.SetMaxThreads(1000, 1000);
//启动工作者线程
ThreadPool.QueueUserWorkItem(new WaitCallback(InsertNewsInfoExt), "param");
相关参数
GetAvailableThreads 剩余空闲线程数
GetMaxThreads 最多可用线程数,所有大于此数目的请求将保持排队状态,直到线程池线程变为可用
GetMinThreads 检索线程池在新请求预测中维护的空闲线程数。
QueueUserWorkItem 启动线程池里得一个线程(队列的方式,如线程池暂时没空闲线程,则进入队列排队)
SetMaxThreads 设置线程池中的最大线程数
SetMinThreads 设置线程池最少需要保留的线程数
这样就解决了无限制 new Thread 的问题,实现了最少改动。
边栏推荐
- [Interview: Concurrency 39: Multithreading: Thread Pool] ThreadPoolExecutor Class - Submit, Stop
- Redis middleware (from building to refuse pit)
- MySQL 必现之死锁
- In the background of the GBase 8c database, what command is used to perform the master-slave switchover operation for the gtm and dn nodes
- 高级驾驶辅助系统ADAS简介
- leetcode-6133: maximum number of groupings
- TiDB的真实数据库数据是存在kv和还是pd上?
- mysql login in cmd and basic operations of database and table
- redis
- Taobao commodity details and details on taobao, senior upgrade version of the API
猜你喜欢
VS“无法查找或打开PDB文件”是怎么回事?如何解决
Detailed explanation of JVM runtime data area and JMM memory model
ClickHouse入门介绍与其特性
scrapy爬虫框架的使用
redis
Parsing MySQL Databases: "SQL Optimization" vs. "Index Optimization"
程序员如何学习开源项目,这篇文章告诉你
朴素贝叶斯--学习笔记--基本原理及代码实现
【无标题】
Intensive reading of ACmix papers, and analysis of its model structure
随机推荐
周鸿祎称微软抄袭 360 安全模式后发文否认;英特尔CEO基辛格回应市值被AMD超越:股价下跌是咎由自取|极客头条
堆内存的介绍及应用(含例子)
优炫数据库支持Oracle哪几种时间及日期类型
Dataset之mpg:mpg数据集的简介、下载、使用方法之详细攻略
Leetcode - 6135: the longest part of the figure
基于MySql,Redis,Mq,ES的高可用方案解析
实验。。。。
[Interview: Concurrency 39: Multithreading: Thread Pool] ThreadPoolExecutor Class - Submit, Stop
Comprehensive experiment BGP
Custom IP used in PCIE
rpm和yum
MySQL query advanced - from the use of functions to table joins, do you remember?
PHP获取时间戳后写数据库的一个问题
【应用推荐】常见资源管理器整理,含个人使用体验和产品选型推荐
ogg同步oracle到mysql,字段里面可能有需要转义的字符,怎么配置转义?
ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API
AC与瘦AP的WLAN组网实验
Batch大小不一定是2的n次幂!ML资深学者最新结论
在GBase 8c数据库后台,使用什么样的命令来对gtm、dn节点进行主备切换的操作
ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API