成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解決 new Thread().Start 導致高并發 CPU 100% 的問題

開發 系統
對于線程隊列 ThreadPool.QueueUserWorkItem 很多人應該都不陌生,將方法排入隊列以便執行,并指定包含該方法所用數據的對象。此方法在有線程池線程變得可用時執行。

之前接手一個項目的時候,發現到處是:

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 的問題,實現了最少改動。

責任編輯:趙寧寧 來源: 程序員編程日記
相關推薦

2010-12-10 08:51:13

Web 2.0Cache集群

2024-07-18 20:18:51

2024-05-07 09:04:39

2024-02-26 08:21:51

CPUkafka死循環

2023-03-20 17:27:54

Cpukafka

2020-07-08 07:00:00

LinuxCPU應用程序

2024-01-15 08:57:13

MySQL高并發

2024-05-27 08:04:41

2025-06-12 02:15:00

Kafka消費者高并發

2024-05-27 08:01:15

2009-08-26 16:58:12

調用C# Thread

2023-10-13 08:11:22

2021-08-10 07:00:01

Redis單線程并發

2015-04-20 10:20:20

高并發Web服務內存和CPU

2012-04-24 09:30:57

淘寶開發

2010-09-03 12:04:52

cpu100%

2023-12-26 11:39:50

CPU系統進程

2021-02-26 13:35:46

JavaCPU內存

2017-08-19 23:21:14

線上CPU定位

2021-05-10 06:38:11

Windows10操作系統微軟
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费爱爱视频 | 欧美中文字幕一区二区三区亚洲 | 亚洲精品一区二区三区免 | 婷婷桃色网 | 国产精品视频久久久 | 亚洲xx在线| 国产你懂的在线观看 | 亚洲一区二区三区久久久 | 国产精品夜间视频香蕉 | 亚洲第一成人影院 | 久久久一二三 | 久久久精彩视频 | 日日操操 | av日韩高清 | 久久机热 | 国产亚洲一区二区三区在线观看 | 日韩高清国产一区在线 | 国产高清精品一区二区三区 | 草久在线 | 夜夜夜操 | 国产精品美女 | 国产精品国产三级国产aⅴ无密码 | 九九热这里 | 亚洲国产成人精品女人久久久 | www.日本三级 | 在线婷婷| 九九在线视频 | 亚洲成人一级片 | 99视频在线| 亚洲三区在线观看 | 国产激情在线 | 免费亚洲视频 | 黄色毛片在线看 | 黄免费看| 久久人爽 | 黄色av一区| 日韩成人影院 | 亚洲精品一区二区冲田杏梨 | 国产一区二区视频免费在线观看 | av影音资源 | 在线 丝袜 欧美 日韩 制服 |