日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#并发编程之初识并行编程

發布時間:2023/12/4 C# 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#并发编程之初识并行编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

之前微信公眾號里有一位叫sara的朋友建議我寫一下Parallel的相關內容,因為手中商城的重構工作量較大,一時之間無法抽出時間。近日,這套系統已有階段性成果,所以準備寫一下Parallel的相關內容,正好也延續之前的C#并發編程系列。

Parallel是并行編程的相關內容,而Parallel.For和Parallel.Foreach又是并行編程中相當重要的方法,所以不能孤立的去討論Parallel,必須要放到并行編程的討論中去

并行化,一般是對所要完成的任務進行劃分,并且以并發的方式處理屬于自己的那份任務,并且最終可以做到整合,所以并行化總會產生并發性。

實際上并行是并發的子集,并發和并行都可以多線程執行,就看其處理器是否是多核的,這些線程能不能同時被cpu多個核執行,如果可以就說明是并行,而并發是多個線程被cpu單核輪流切換著執行。總之,只有在多核處理器上并行才會有意義

并行化總會有著很大的挑戰,即每一個部分以不同順序或者交錯執行,都能保證最終結果的正確性,尤其涉及到各并行部分之間需要串行執行的部分,這個挑戰是很大的。由于并行化程序設計要比普通的串行代碼復雜很多,也難維護很多,所以不是所有的問題都可以使用并行的。比如絕對執行時間本來就很少,即使使用并發可以提高整體的執行時間,那么我們也應該使用傳統方式。但是如果主要涉及到提升用戶響應能力的功能,那么我們推薦使用并行編程,同時處理分割后依然可以獨立進行而不影響整體任務的功能也可以使用并行編程。

并行的相關實戰

說到并行,就需要先說下.NET FX4中引入的Task Parallel Library(任務并行庫),簡稱TPL。TPL主要覆蓋了三大使用場景,數據并行、任務并行和流水線,TPL以其高度的封裝特性,隱藏了并行編程里復雜的處理,使得開發人員可以以較低的門檻進行并行編程。

數據并行

這種場景在于有大量數據需要處理,而且對每一份數據都要執行的同樣的操作。

任務并行

有很多相對獨立的不同操作,或者可以分割成多個子任務但彼此之間是獨立的,就可以通過任務并行來發揮并行化的優勢

流水線

流水線是以上兩種場景的結合,這個也是最復雜最難處理的場景,因為這里面涉及到多個并發的任務進行協調處理。

此場景,奈何小編理解的不是很好,所以不敢亂寫,多方查找資料,找到了oschina上的一篇文章。

流水線技術,指的是允許一個機器周期內的計算機各處理步驟重疊進行。特別是,當執行一條指令時,可以讀取下一條指令,也就意味著,在任何一個時刻可以有不止一條指令在“流水線”上,每條指令處在不同的執行階段。這樣,即便讀取和執行每條指令的時間保持不變,而計算機的總的吞吐量提高了。

原文地址:https://my.oschina.net/u/3374461/blog/1930305

System.Threading.Tasks.Parallel類

雖然Parallel類在System.Threading.Tasks命名空間下,但是創建并行代碼不一定要直接使用Task類的實例,我們可以直接使用Parallel靜態類所提供的方法。

Parallel.For:為固定數目的獨立For循環迭代提供了負載均衡式的并行執行

Parallel.For(0, 5, i => {Console.WriteLine("the number is", i); });

Parallel.Foreach:為固定數目的獨立ForEach循環迭代提供了負載均衡式的并行執行。這個方法支持自定義分區器(Partitioner),以使得我們可以完全掌控數據分發。

string[] letters = new string[] {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"}; Parallel.ForEach(letters, i => Console.WriteLine("letter is " + i));

Parallel.Invoke:為給定的獨立任務提供了負載均衡式的并行執行,接下來會重點討論這個方法。

Parallel.Invoke

這個方法很實用,也很簡單。

以下代碼可以返回void的無參數方法:

Parallel.Invoke(Method1(), Method2(), Method3(), Method4()); 通過Lambda表達式運行: Parallel.Invoke(() => Method1(), () => Method2(), () => Method3(), () => Method4());

通過Lambda表達式和匿名類型來運行:

Parallel.Invoke(() => {Method1();// Do something }, () => {Method2();// Do something}, () =>{Method3();// Do something}, () =>{Method4();// Do something });

以上代碼需要并行執行四個方法,但是如果空余邏輯內核不足四個或者根本就沒有四個邏輯內核,這四個方法是不能并發執行的。因此在理想情況下,正好有至少四個空余邏輯內核時,我們就可以并行執行這四個方法了。

這四個方法,我們無法準確的預測其執行順序,因為這一切是由底層的邏輯會根據運行時的現有可用資源創建出最合適的執行計劃。當然TPL依然有機制保證方法的順序執行,這個以后我們再討論。

Parallel.Invoke最大的優勢就是簡單,但是并不能因為它簡單,就不分場合的使用,事實上,我們需要在某些場景下權衡使用。

  • 如果這四個方法的執行時間不一致,那么就需要根據最長的執行時間才能返回控制,這就可能造成一些邏輯內核處于閑置狀態。所以我們需要預測一下大致的執行時間,如果時間過長,那么就要認真考慮是否真的需要使用這個方法。

  • 其擴展性很差,因為它只能調用固定數目的邏輯內核,剩余內核就會一直處于閑置狀態。

  • 方法之間的交互極其困難,極易產生Bug,當然這是并行編程的常見問題,TPL也考慮到了這點,也有足夠機制解決這個問題。

  • 如果其中某個方法有了異常,捕捉異常會很困難,所以需要大家在相應的被調用方法里編寫足夠的日志。

  • 小編在以前的使用中還遇到了內存溢出的異常,這些也會在以后的文章中說明其原因以及解決方法。

今天就寫到這兒吧,已經十二點了,要休息一下,保護頭發了,哈哈哈。

總結

以上是生活随笔為你收集整理的C#并发编程之初识并行编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。