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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三分钟总览微软任务并行库TPL

發(fā)布時間:2023/12/4 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三分钟总览微软任务并行库TPL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方藍字進行關(guān)注

有小伙伴問我每天忽悠的TPL是什么?

?? 這次站位高一點,嚴肅講一講。

引言

俗話說,不想開飛機的程序員不是一名好爸爸;作為微軟技術(shù)棧的老鳥,一直將代碼整潔之道奉為經(jīng)典, 優(yōu)秀的程序員將優(yōu)雅、高性能的代碼看成自己的臉面。

今天探討下我對.NET并行編程庫Task Parallel Library的理解,開足馬力,準備壓榨CPU了。

雙核cpu的真相.gif

技術(shù)背景

硬件線程和軟件線程

? ?多核處理器帶有一個以上的物理內(nèi)核:物理內(nèi)核是真正的獨立處理單元,多個物理內(nèi)核使得多條指令能夠同時并行運行。

硬件線程也稱為邏輯內(nèi)核,一個物理內(nèi)核可能會使用超線程技術(shù)提供多個硬件線程,所以一個硬件線程并不代表一個物理內(nèi)核。程序通過Environment.ProcessorCount?得到的就是邏輯內(nèi)核(本人的機器是i5-5300U 虛擬4核), Windows中每個運行的程序都是一個進程,每一個進程都會創(chuàng)建并運行一個或多個線程,這些線程稱為軟件線程,硬件線程就像是一條泳道,而軟件線程就是在其中游泳的人。

并行場景

.NET引入的Task Parallel Library(任務(wù)并行庫,TPL),動態(tài)地擴展并發(fā)度,以最有效的方式使用所有可用的處理器。

另外TPL支持分區(qū)工作、支持基于ThreadPool調(diào)度、支持取消異步操作、支持狀態(tài)管理。

通過TPL專注與讓程序完成你業(yè)務(wù)意義上的任務(wù),同時最大限度的提高程序性能。

TPL同時支持數(shù)據(jù)并行、任務(wù)并行和流水線Dataflow

1.數(shù)據(jù)并行:有大量數(shù)據(jù)需要處理,并且必須對每一份數(shù)據(jù)執(zhí)行同樣的操作;2.任務(wù)并行:通過任務(wù)并發(fā)運行不同的操作;3.流水線:任務(wù)并行和數(shù)據(jù)并行的結(jié)合體(需要引入System.Threading.Tasks.Dataflow組件庫)?
其中1、3 已經(jīng)在上文演示,本文就隨手拿數(shù)據(jù)并行、任務(wù)并行聊一聊。

編程實踐

1. 數(shù)據(jù)并行

找到100000以內(nèi)素數(shù)的個數(shù)

上文[共享內(nèi)存并發(fā)模型],代碼可做如下優(yōu)化:

由每個線程獨立計算線程內(nèi)迭代產(chǎn)生的素數(shù)和,最后再對幾個和求和。

using?System; using?System.Threading.Tasks; using?System.Collections; using?System.Collections.Generic; using?System.Threading; using?System.Diagnostics;///?<summary> ///?利用并行編程庫Parallel,計算100000內(nèi)素數(shù)的個數(shù) ///?</summary> namespace?Paralleler {class?Program{static?void?Main(string[]?args){Stopwatch?sw?=?new?Stopwatch();sw.Start();ShareMemory();sw.Stop();Console.WriteLine($"優(yōu)化后的共享內(nèi)存并發(fā)模型耗時:{sw.Elapsed}");}static?void?ShareMemory(){var?sum?=?0;Parallel.For(1,?100000?+?1,?()?=>?0,?(x,?state,?local)?=>{var?f?=?true;if?(x?==?1)f?=?false;for?(int?i?=?2;?i?<=?x?/?2;?i++){if?(x?%?i?==?0)??//?被[2,x/2]任一數(shù)字整除,就不是質(zhì)數(shù)f?=?false;}if?(f?==?true)local++;return?local;},local?=>{Interlocked.Add(ref?sum,?local);});Console.WriteLine($"1-100000內(nèi)質(zhì)數(shù)的個數(shù)是{sum}");}} } 參數(shù)1,2 表示數(shù)據(jù)并行要操作的對象; 參數(shù)3localInit表示某線程內(nèi)迭代的初始值,將會作為參數(shù)4body委托的第3個參數(shù),只在線程第一次使用;參數(shù)4body表示每個迭代都需要經(jīng)歷的執(zhí)行體, 這里以線程為單元處理迭代; 參數(shù)5localFinally對每個線程的輸出再做一次計算,入?yún)⑹菂?shù)4的輸出。

2. 任務(wù)并行

? 讓許多方法并行運行的最簡單的方法就是使用Parallel類的Invoke方法,Invoke方法接受一個Action的參數(shù)組

void System.Threading.Tasks.Parallel.Invoke(WatchMovie, HaveDinner, ReadBook, WriteBlog);

這段代碼會創(chuàng)建指向每一個方法的委托。

沒有特定的執(zhí)行順序

Parallel.Invoke方法只有在4個方法全部完成之后才會返回。它至少需要4個硬件線程才足以讓這4個方法并發(fā)運行。


但并不保證這4個方法能夠同時啟動運行,如果一個或者多個內(nèi)核處于繁忙狀態(tài),那么底層的調(diào)度邏輯可能會延遲某些方法的初始化執(zhí)行。

捕捉并行循環(huán)中發(fā)生的異常

當并行迭代中調(diào)用的委托拋出異常,這個異常沒有在委托中被捕獲到時,就會變成一組異常,新的System.AggregateException負責處理這一組異常。

本文為微軟TPL入門級教程,學習一個專題,了解特性/能力最重要, 剩下的就是結(jié)合場景去應(yīng)用。

本文內(nèi)容和制圖均為原創(chuàng),文章永久更新地址請參閱左下角原文,如對您有所幫助,【在看、點贊】來一發(fā),未嘗不可?。

專題相關(guān) 一網(wǎng)打盡

? 三分鐘掌握共享內(nèi)存 & Actor并發(fā)模型~~~

?你管這叫"線程安全"?~~~

?.Net線程同步技術(shù)解讀

?Redis分布式鎖抽絲剝繭

?看過這么多爆文,依舊走不好異步編程這條路?

?TPL Dataflow組件應(yīng)對高并發(fā),低延遲要求

?如何利用.NETCore向Azure EventHubs準實時批量發(fā)送數(shù)據(jù)?

?難纏的布隆過濾器,這次終于通透了

掃碼關(guān)注我們

不會讓您失望的。

總結(jié)

以上是生活随笔為你收集整理的三分钟总览微软任务并行库TPL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。