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

C# 多線程,論多核時代愛恨情仇

開發 后端
老板只有兩種,好的和壞的。好的老板只跟你談錢,壞的老板只跟你談理想。

博客前言

為什么要學習多線程?

  • 2010年1月21日是10年某市公務員考試的報名截止日。因從下午2點開始,用于報名的北京市人事考試網癱瘓,原定于昨天下午5點截止的報名時間延遲至今天上午11點。

  • 2011年3月11日下午5時(北京時間12日早9點),蘋果發布新一代的平板電腦產品iPad 2,配備了A5.1Ghz雙核處理器,這寓意著平板電腦和筆記本一同進入"多核時代"。

  • 同年6月18日,國內著名B2C---京東在周年慶典之際舉行了"隆重"的大規模的促銷活動,搶購隨之而來,訂單擠爆京東 限時達臨時取消。 昨天有消費者反映,由于點擊量過大,18日早上京東商城網站一度癱瘓。一位消費者說:“18日凌晨1點開始就登不上京東商城。”劉強東也表示:由于流量多 次超過4個G,服務器運行緩慢。 昨天,京東商城官網發布公告稱,“‘618’活動異?;鸨矣脩粝聠嗡俣瓤涨?,致使部分用戶已購訂單顯示出現延遲,用戶在一段時間內無法在‘我的京東’中 查詢到自己的訂單。目前已購訂單顯示延遲的問題已得到有效解決,對此給您帶來的不便,我們深表歉意。”

  • 2015年05月05日登錄風信子網上商城發現,首頁除了廣告和相關消息外,只有“注冊賬號獲取更多優惠”這唯一一個按鈕,沒有商品展示,沒有產 品搜索,不能網上下單,甚至連進入商城的按鈕也沒有。風信子南沙跨境商品直購體驗中心相關負責人表示,這主要是因為預約的人數太多,截至五一,預約人數已 超過十萬,太多人頻繁登陸,導致網店服務器癱瘓,目前技術人員還在努力維修中。該負責人介紹,體驗中心的網站目前正在調試,“網站目前的作用主要是給市民 預約和提前注冊,通過網絡注冊的市民不用在現場驗證身份證等信息,可以提高購買效率。”

下面通過一些實例來認識一下多線程和讓大家知道為什么要學習多線程。

[[157023]]

寫在前面

老板只有兩種,好的和壞的。好的老板只跟你談錢,壞的老板只跟你談理想。

v模擬場景

假設后臺有個monitor時事的在監測訂單,且可以發現訂單然后處理訂單,每次(1次/S)可以處理1千個訂單,需要向倉庫系統發出指令,讓他們負責配送發貨。那么我們來寫一個EmulationSystem(模擬系統)

C# 多線程

JobHelper因為我們只是為了模擬一個環境,所以它是這樣的。

 

  1. //------------------------------------------------------------------------------ 
  2. // <copyright file="JobHelper.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥"> 
  3. //     Copyright (C) 2015-2016 All Rights Reserved 
  4. //     原博文地址: http://www.cnblogs.com/toutou/ 
  5. // </copyright>  
  6. //------------------------------------------------------------------------------ 
  7. namespace CNBlogs.Common.Shared 
  8.     using System.Threading; 
  9.     /// <summary> 
  10.     /// Job helper 
  11.     /// </summary> 
  12.     public class JobHelper 
  13.     { 
  14.         /// <summary> 
  15.     /// Get job total count 
  16.         /// </summary> 
  17.     /// <returns></returns> 
  18.     public int GetJobCount() 
  19.         { 
  20.             // 我們的側重點是多線程,所以我們就模擬每次有1千個訂單,而模擬,所以我們不關心其他的。只要訂單數量。 
  21.     return 1000
  22.         } 
  23.         /// <summary> 
  24.     /// Submit job 
  25.         /// </summary> 
  26.     /// <param name="jobId">For job id</param> 
  27.     /// <returns>Submit job status</returns> 
  28.     public bool SubmitJob(int jobId) 
  29.         { 
  30.             // 假設針對每個訂單向后臺發送任務需要1秒,而且每個訂單都能成功發送 
  31.             Thread.Sleep(1000); 
  32.             return true
  33.         } 
  34.     } 

 

背景我們也交待完了,現在需要來得到這些訂單信息以后,向倉庫submit這些訂單。

v實戰演習

根據這種背景,我們可以有很多處理的辦法。

  • 傳統辦法:

    (開啟無腦模式:未使用多線程)

    代碼正文:

     

    1. //------------------------------------------------------------------------------ 
    2. // <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥"> 
    3. //     Copyright (C) 2015-2016 All Rights Reserved 
    4. //     原博文地址: http://www.cnblogs.com/toutou/ 
    5. // </copyright>  
    6. //------------------------------------------------------------------------------ 
    7. namespace CNBlogs.EmulationSystem 
    8.     using System; 
    9.     using System.Threading; 
    10.     using CNBlogs.Common.Shared; 
    11.     class Runner 
    12.     { 
    13.         /// <summary> 
    14.                 /// Job helper 
    15.         /// </summary> 
    16.                 private static JobHelper jobHelper = new JobHelper(); 
    17.         /// <summary> 
    18.                 /// Runner lock 
    19.         /// </summary> 
    20.                 private static Mutex mutex; 
    21.         static void Main(string[] args) 
    22.         { 
    23.             // 記錄開始處理的時間 
    24.             DateTime paddingTime = DateTime.Now.ToLocalTime(); 
    25.             int orderCount = jobHelper.GetJobCount(); 
    26.             // 用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。 
    27.             // 當前進程只能啟動一次 
    28.             mutex = new Mutex(false"CNBlogs.EmulationSystem"); 
    29.             if (!mutex.WaitOne(0false)) 
    30.             { 
    31.                 Console.Out.WriteLine("Monitor already running..."); 
    32.                 return
    33.             } 
    34.             for (int i = 0; i < orderCount; i++) 
    35.             { 
    36.                 // 假設i就是job id 
    37.                 jobHelper.SubmitJob(i); 
    38.             } 
    39.             // 記錄處理完成的時間 
    40.             DateTime completeTime = DateTime.Now.ToLocalTime(); 
    41.             var minutes = (completeTime - paddingTime).TotalSeconds; 
    42.             Console.WriteLine(string.Format("處理{0}個訂單,花費時間{1}秒", orderCount, minutes)); 
    43.         } 
    44.     } 

    PS:現在的這些個電商,動不動來個什么周年慶店慶什么雙11雙12的一頓突突,搞得咱這些老百姓就全部蜂擁而上,顯然如果用傳統的方法雖然不會出錯,但是老板肯定會找你喝茶。在多核時代用這種方法也只能鐵不成鋼了。所以這個方法是絕對不可取的。

  • Task方法:

    如果有對Task不是很熟悉的園友可以在這里解開心謎。

    代碼正文:

     

    1. //------------------------------------------------------------------------------ 
    2. // <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥"> 
    3. //     Copyright (C) 2015-2016 All Rights Reserved 
    4. //     原博文地址: http://www.cnblogs.com/toutou/ 
    5. // </copyright>  
    6. //------------------------------------------------------------------------------ 
    7. namespace CNBlogs.EmulationSystem 
    8.     using System; 
    9.     using System.Collections.Generic; 
    10.     using System.Threading; 
    11.     using System.Threading.Tasks; 
    12.     using CNBlogs.Common.Shared; 
    13.     class Runner 
    14.     { 
    15.         /// <summary> 
    16.                 /// Job helper 
    17.         /// </summary> 
    18.                 private static JobHelper jobHelper = new JobHelper(); 
    19.         /// <summary> 
    20.                 /// Runner lock 
    21.         /// </summary> 
    22.                 private static Mutex mutex; 
    23.         static void Main(string[] args) 
    24.         { 
    25.             // 記錄開始處理的時間 
    26.             DateTime paddingTime = DateTime.Now.ToLocalTime(); 
    27.             int orderCount = jobHelper.GetJobCount(); 
    28.             // 用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。 
    29.             // 當前進程只能啟動一次 
    30.             mutex = new Mutex(false"CNBlogs.EmulationSystem"); 
    31.             if (!mutex.WaitOne(0false)) 
    32.             { 
    33.                 Console.Out.WriteLine("Monitor already running..."); 
    34.                 return
    35.             } 
    36.             var taskList = new List<Task>(); 
    37.             for (int i = 0; i < orderCount; i++) 
    38.             { 
    39.                 int temp=i; 
    40.                 taskList.Add(Task.Factory.StartNew(() => 
    41.                 { 
    42.                     // 假設i就是job id 
    43.                     jobHelper.SubmitJob(temp); 
    44.                 })); 
    45.             } 
    46.             // 等待所有task執行完畢 
    47.             Task.WaitAll(taskList.ToArray()); 
    48.             // 記錄處理完成的時間 
    49.             DateTime completeTime = DateTime.Now.ToLocalTime(); 
    50.             var minutes = (completeTime - paddingTime).TotalSeconds; 
    51.             Console.WriteLine(string.Format("Complete: {0},cost {1} s", orderCount, minutes)); 
    52.         } 
    53.     } 

     

    代碼效果:

    C# 多線程

    相信分別從有TASK和沒有TASK的這兩次demo中,可以清楚的發現多線程處理這些頻繁交互能力的魅力。你會愛上這個方法。確實提高的效率。但是問題也隨之而來,一個進程多線程的總數和大小是有要求的(這個取決于服務器的配置),不是任由我們肆意的開采的。如果訂單太多,我們不控制task那是會拉仇恨的。task需要控制。

    C# 多線程

  • Semaphore:

    如果有對Semaphore不是很熟悉的園友可以在這里解開心謎。

    代碼正文: 

    1. //------------------------------------------------------------------------------ 
    2. // <copyright file="Runner.cs" company="CNBlogs Corporation" owner="請叫我頭頭哥"> 
    3. //     Copyright (C) 2015-2016 All Rights Reserved 
    4. //     原博文地址: http://www.cnblogs.com/toutou/ 
    5. // </copyright>  
    6. //------------------------------------------------------------------------------ 
    7. namespace CNBlogs.EmulationSystem 
    8.     using System; 
    9.     using System.Collections.Generic; 
    10.     using System.Threading; 
    11.     using System.Threading.Tasks; 
    12.     using CNBlogs.Common.Shared; 
    13.     class Runner 
    14.     { 
    15.         /// <summary> 
    16.                 /// Job helper 
    17.         /// </summary> 
    18.                 private static JobHelper jobHelper = new JobHelper(); 
    19.         /// <summary> 
    20.                 /// The locker used to lock the semaphore and thread. 
    21.         /// </summary> 
    22.                 private static object lockerObj = new object(); 
    23.         /// <summary> 
    24.                 /// The semaphore limit the thread number of get latest test info 
    25.         /// </summary> 
    26.                 private static Semaphore semaphoreLimit; 
    27.         /// <summary> 
    28.                 /// Runner lock 
    29.         /// </summary> 
    30.                 private static Mutex mutex; 
    31.         static void Main(string[] args) 
    32.         { 
    33.             // 記錄開始處理的時間 
    34.             DateTime paddingTime = DateTime.Now.ToLocalTime(); 
    35.             int orderCount = jobHelper.GetJobCount(); 
    36.             // 用一個指示調用線程是否應擁有互斥體的初始所屬權的布爾值來初始化 Mutex 類的新實例。 
    37.             // 當前進程只能啟動一次 
    38.             mutex = new Mutex(false"CNBlogs.EmulationSystem"); 
    39.             if (!mutex.WaitOne(0false)) 
    40.             { 
    41.                 Console.Out.WriteLine("Monitor already running..."); 
    42.                 return
    43.             } 
    44.             // 假設我們的服務器一個進程只能接受的大小=當前線程大小*500 ps:500是設置信號量的最大值 
    45.                 int maxProcNumber = 500
    46.             using (semaphoreLimit = new Semaphore(0, maxProcNumber)) 
    47.             { 
    48.                 // 以指定的次數退出信號量并返回前一個計數。 
    49.                 semaphoreLimit.Release(maxProcNumber); 
    50.                 var taskList = new List<Task>(); 
    51.                 for (int i = 0; i < orderCount; i++) 
    52.                 { 
    53.                     int temp=i; 
    54.                     // 如果SubmitJob有IO或者其他容易因為沖突而引起異常的話,這里需要加上lock 
    55.                     //lock (lockerObj) 
    56.                     //{ 
    57.                         semaphoreLimit.WaitOne(); 
    58.                         taskList.Add(Task.Factory.StartNew(() => 
    59.                         { 
    60.                             // 假設i就是job id 
    61.                             jobHelper.SubmitJob(temp); 
    62.                             // 退出信號量并返回前一個計數。 
    63.                             semaphoreLimit.Release(); 
    64.                         })); 
    65.                     //} 
    66.                 } 
    67.                 // 等待所有task執行完畢 
    68.                 Task.WaitAll(taskList.ToArray()); 
    69.             } 
    70.             // 記錄處理完成的時間 
    71.             DateTime completeTime = DateTime.Now.ToLocalTime(); 
    72.             var minutes = (completeTime - paddingTime).TotalSeconds; 
    73.             Console.WriteLine(string.Format("Complete: {0},cost {1} s", orderCount, minutes)); 
    74.         } 
    75.     } 

    代碼效果:

v博客總結

多線程路還很長...

 

責任編輯:王雪燕 來源: 博客園
相關推薦

2024-06-07 00:09:50

2022-05-13 09:47:28

Docker容器

2020-11-24 10:13:20

測試開發管理

2022-09-02 12:13:22

TCPUDP場景

2025-01-03 09:39:04

2009-08-12 18:04:44

編寫C#多線程

2021-04-12 06:08:16

HiveSpark大數據

2020-10-07 22:21:13

程序員技術線程

2009-08-28 16:43:57

C#多線程學習

2009-09-04 15:09:48

C#多線程啟動Squa

2021-05-10 23:28:29

vRANC-RANO-RAN

2019-05-15 15:10:12

Tomcat Session Cookie

2024-08-07 08:22:27

2013-02-20 10:00:16

微軟CodePlexGitHub

2020-04-09 15:26:55

間諜軟件NSOFacebook

2022-05-07 07:43:07

Redis存儲系統數據庫

2021-06-16 06:48:06

接口微信

2009-08-26 18:13:55

C#多線程lock

2011-04-25 14:42:10

C#lock

2024-10-21 16:59:37

C#編程多線程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美国黄色毛片 | 成人在线观看网址 | 夜夜夜夜夜夜曰天天天 | 国产综合精品 | 日韩精品一区二区三区中文在线 | 中文精品视频 | 夜夜骚| 国产精品国产成人国产三级 | 国产成人精品一区二区三区网站观看 | 亚洲一区二区三区在线播放 | 91视视频在线观看入口直接观看 | 成人免费视频观看视频 | 久久中文字幕一区 | 精品香蕉一区二区三区 | 午夜成人免费视频 | 久久久久久国产精品mv | 无码一区二区三区视频 | 亚洲精品一区中文字幕乱码 | 久久91精品久久久久久9鸭 | 日韩毛片免费看 | 三区四区在线观看 | 免费在线观看av网址 | 精品二 | 日皮视频免费 | 国产精品久久久久久久毛片 | 91高清在线观看 | 黄色免费av| 久久精品国产亚洲a | 欧美精品一二区 | 在线视频成人 | 成人免费网站在线 | 国产精品一二三区在线观看 | 91九色在线观看 | 久草视频网站 | 欧美极品视频在线观看 | 99re6在线 | 久热精品在线播放 | 精品一二三| 一区二区精品 | 日韩在线综合 | 日韩久久中文字幕 |