自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解決 new Thread().Start 導(dǎo)致高并發(fā) CPU 100% 的問題

開發(fā) 系統(tǒng)
對于線程隊(duì)列 ThreadPool.QueueUserWorkItem 很多人應(yīng)該都不陌生,將方法排入隊(duì)列以便執(zhí)行,并指定包含該方法所用數(shù)據(jù)的對象。此方法在有線程池線程變得可用時(shí)執(zhí)行。

之前接手一個項(xiàng)目的時(shí)候,發(fā)現(xiàn)到處是:

new Thread(()=>{
//do something
}).Start();

這么做的目的,無非是為了減少頁面等待時(shí)間提高用戶體驗(yàn),把一些浪費(fèi)時(shí)間的操作放到新線程中在后臺運(yùn)行。

問題

但是這樣帶來的問題是大量的創(chuàng)建線程,非常影響項(xiàng)目的性能,尤其是在一些大并發(fā)量訪問的時(shí)候,經(jīng)常導(dǎo)致后果是cpu 100%。

當(dāng)然,如果你的項(xiàng)目到處是這樣寫的,然后,沒掛,至少說明這個方法沒幾個人再用。

解決方法

于是下意識的想著給項(xiàng)目優(yōu)化下, 第一想法是走隊(duì)列,但是發(fā)現(xiàn)項(xiàng)目壓根沒有使用隊(duì)列,很多操作還停留在 有個任務(wù)表,有任務(wù)的時(shí)候,往里面加內(nèi)容,然后有個定時(shí)任務(wù),每分鐘執(zhí)行一次,定時(shí)的去消費(fèi)任務(wù);

于是想著怎么先最少的改動,先把問題解決,后面的事情在做考慮。

其實(shí)問題的本質(zhì)是new 太多Thread了,那么最簡單的方法就是限制數(shù)量。

于是 ThreadPool.QueueUserWorkItem就登場了。

對于線程隊(duì)列 ThreadPool.QueueUserWorkItem 很多人應(yīng)該都不陌生,下邊看微軟的解釋:

將方法排入隊(duì)列以便執(zhí)行,并指定包含該方法所用數(shù)據(jù)的對象。此方法在有線程池線程變得可用時(shí)執(zhí)行。

方法如下:

  protected static Logger Logger = LogManager.GetCurrentClassLogger();
        public ActionResult Index()
        {
          //  Logger.Debug("執(zhí)行了  開始 ");
            ThreadPool.QueueUserWorkItem(new WaitCallback(InsertNewsInfoExt), "param");
         //   Logger.Debug("執(zhí)行了  結(jié)束 ");
            return View();
        }
        private void InsertNewsInfoExt(object info)
        {
         //   Logger.Debug("執(zhí)行了  InsertNewsInfoExt  開始");
            Thread.Sleep(1000*200);
            Logger.Debug("執(zhí)行了  InsertNewsInfoExt 結(jié)束 ");
            new Thread(t =>
            {
                try
                {
                    Logger.Debug("執(zhí)行了  Thread ");
                 
                }
                catch (Exception ex)
                {
                    Logger.Error(ex.Message);
                }

            }).Start();

        }

根據(jù)msdn描述:線程池的默認(rèn)大小為每個可用處理器有 25 個線程。使用 SetMaxThreads 方法可以更改線程池中的線程數(shù):

  //工作者線程最大數(shù)目,I/O線程的最大數(shù)目
            ThreadPool.SetMaxThreads(1000, 1000);   
            //啟動工作者線程
           ThreadPool.QueueUserWorkItem(new WaitCallback(InsertNewsInfoExt), "param");

相關(guān)參數(shù)

  • GetAvailableThreads:剩余空閑線程數(shù)
  • GetMaxThreads:最多可用線程數(shù),所有大于此數(shù)目的請求將保持排隊(duì)狀態(tài),直到線程池線程變?yōu)榭捎?/li>
  • GetMinThreads:檢索線程池在新請求預(yù)測中維護(hù)的空閑線程數(shù)。
  • QueueUserWorkItem:啟動線程池里得一個線程(隊(duì)列的方式,如線程池暫時(shí)沒空閑線程,則進(jìn)入隊(duì)列排隊(duì))
  • SetMaxThreads:設(shè)置線程池中的最大線程數(shù)
  • SetMinThreads:設(shè)置線程池最少需要保留的線程數(shù)

這樣就解決了無限制 new Thread 的問題,實(shí)現(xiàn)了最少改動。

責(zé)任編輯:趙寧寧 來源: 程序員編程日記
相關(guān)推薦

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死循環(huán)

2023-03-20 17:27:54

Cpukafka

2020-07-08 07:00:00

LinuxCPU應(yīng)用程序

2024-01-15 08:57:13

MySQL高并發(fā)

2024-05-27 08:04:41

2024-05-27 08:01:15

2009-08-26 16:58:12

調(diào)用C# Thread

2015-04-20 10:20:20

高并發(fā)Web服務(wù)內(nèi)存和CPU

2021-08-10 07:00:01

Redis單線程并發(fā)

2023-10-13 08:11:22

2012-04-24 09:30:57

淘寶開發(fā)

2020-11-26 10:58:08

線程啟動

2010-09-03 12:04:52

cpu100%

2023-12-26 11:39:50

CPU系統(tǒng)進(jìn)程

2021-02-26 13:35:46

JavaCPU內(nèi)存

2021-05-10 06:38:11

Windows10操作系統(tǒng)微軟

2024-10-18 10:04:01

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號