-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

.NET并發編程實戰

( 簡體 字)
作者:[美] 里卡爾多·特雷爾(Riccardo Terrell)著 葉偉民 譯類別:1. -> 程式設計 -> .NET
譯者:
出版社:清華大學出版社.NET并發編程實戰 3dWoo書號: 52793
詢問書籍請說出此書號!

缺書
NT售價: 640

出版日:5/1/2020
頁數:538
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787302549598
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

你可能正在閱讀這本《.NET并發編程實戰》,因為你希望構建速度極快的應用程序,或者想學習如何顯著提高現有應用程序的性能。你關心性能,因為你致力于生成更快的程序,而且當代碼中的一些更改使應用程序更快,響應更快時,你會感到興奮。并行編程為對新開發技術充滿熱情的開發人員提供了無限的可能性。當需要考慮性能時,無論怎么強調在編程中使用并行的好處也不為過。但是,使用命令式和面向對象的編程風格來編寫并發代碼會很復雜,并引入了復雜性。因此,并發編程并沒有被廣泛地作為一種常見的實踐所接受,這迫使程序員去尋找其他解決方案。
上大學的時候,我學習了函數式編程課程。那時,我學習的是Haskell,盡管該語言學習曲線很陡峭,難度很高,但是我很享受該課程的每一節課。因為我記得當我看到第一個例子時,對其解決方案的優雅以及簡單而感到驚訝。15年后,當我開始尋找利用并發來增強我的程序的解決方案時,我又想起這些課程。這一次,我能夠充分地認識到函數式編程在設計我的日常程序時的強大和有用。使用函數式編程風格存在一些益處,我將在《.NET并發編程實戰》中對這些益處逐一進行討論。
當時,我需要為醫保行業構建一個軟件系統,我的學術研究與專業工作在這里重合了。該項目需要開發一個應用程序去分析放射性醫學圖像。圖像處理需要圖像降噪、高斯算法、圖像插值和圖像濾波等幾個步驟才能將顏色應用于灰度圖像。該應用程序是使用Java開發的,最初能夠按預期運行。但是后來該部門增加了需求,這種情況經常發生,這時問題就開始出現了。雖然軟件沒有任何問題或錯誤,但隨著要分析的圖像數量的增加,它變得更慢了。
當然,對這個問題提出的第一個解決方案是購買一個更強大的服務器。雖然在當時這是一個有效的解決方案,但是今天如果你購買一個新機器的目的是為了獲得更快的CPU計算速度,你會感到失望的。這是因為現代CPU雖然有多個內核,但是其中單個內核的速度并不比2007年購買時的單個內核快。比購買新的服務器更好和更持久的替代方法是引入并行來利用多核硬件及其所有資源,從而最終加快圖像處理。
從理論上講,這是一項簡單的任務,但是實際上并非如此。我必須學習如何使用線程和鎖。遺憾的是,我在死鎖方面獲得了第一手經驗。
這個死鎖迫使我對應用程序的代碼進行了大規模的修改。修改多到引入了bug,甚至與我做修改的原始目的無關。我很沮喪,這些代碼是不可維護和脆弱的,整個過程很容易出現錯誤。我不得不在原來的問題上退一步,從不同的角度尋找解決方案。必須要有更好的辦法。
我們使用的工具對我們的思維習慣產生深遠的影響,因此也會影響我們的思維能力。
—Edsger Dijkstra
在花了幾天時間尋找解決多線程錯亂失控問題的解決方案后,我找到了答案。我所研究和閱讀的一切都指向函數式范式。多年前我在大學課堂上學到的準則現在成為我前進的機理。我使用函數式語言重寫圖像處理應用程序的核心以應用并行運行。從命令式過渡到函數式最初是一個挑戰。我幾乎忘記了我在大學中學到的一切,所以我并不自豪地說,在這次經歷中,我所編寫的代碼在函數式語言中看起來是非常面向對象的,但總體來說這是個成功的決定。新程序的編譯和運行具有顯著的性能改進,硬件資源得到了完全利用并且毫無錯誤。另外,一個意想不到的驚喜是,函數式編程導致代碼行的數量顯著減少: 比使用面向對象語言的原始實現減少了近50%。
這次經歷讓我重新考慮OOP是否適合作為解決所有編程問題的答案。我意識到這種編程模型和解決問題的方法視野有限。我這次進入函數式編程的旅程就是始于對良好的并發編程模型的要求。
從此之后,我對應用于多線程和并發的函數式編程產生了濃厚的興趣。在看到復雜問題和問題根源時,我就會想到這些問題在函數式編程中的解決方案,函數式編程是一個功能強大的工具,可以使用可用的硬件來更快地運行。我開始欣賞這門學科是如何以一種連貫的、可組合的、漂亮的方式來編寫并發程序的。
我第一次產生寫這本書的想法是在 2010年7月,那時微軟推出F# 并將其作為Visual Studio 2010的一部分。那時我對業界的趨勢就已經很清楚了,越來越多的主流編程語言支持函數式,包括 C#、C++、Java和Python。2007年,C# 3.0引入了頭等函數和新的構造(如lambda表達式和類型推斷),從而引入函數式編程概念,并且很快就出現了允許聲明式編程風格的語言集成查詢(Language Integrate Query,LINQ)。
.NET平臺已經融入了函數式世界。隨著F#的引入,Microsoft擁有了同時支持面向對象和函數式范式的功能齊全的語言。此外,像C#這樣的面向對象語言變得越來越混合了,彌合了不同編程模式之間的差距,從而允許這兩種編程風格共存。
此外,我們正面臨著多核時代,在這個時代里,CPU能力是以可用內核的數量來衡量的, 而不是以每秒的時鐘周期來衡量的。有了這一趨勢之后,單線程應用程序將無法在多核系統上實現更高的速度,除非該應用程序集成了并行性并使用算法將工作分散到多個內核上。
現在已經很清楚了,多線程是必需的,這個觀點點燃了我把這種編程方法帶給你的熱情。《.NET并發編程實戰》結合了并發編程和函數式范式的強大功能,并使用C#和F#語言來編寫可讀的、更模塊化的和可維護的代碼。你的代碼將受益于這些技術,以更少的代碼在最佳性能下運行,從而提高工作效率和程序的彈性。
開始開發多線程代碼是一個激動人心的時刻。在這個過程中,軟件公司比以往任何時候都更需要合適的工具和技術以便在不需要做出妥協的情況下選擇對應的正確編程風格。在學習并行編程的過程中,最開始的挑戰將會很快地減少,而對你毅力的回報則是無限的。
無論你的專業領域是什么,無論你是后端開發人員還是前端Web開發人員,無論你是開發基于云的應用程序或視頻游戲,使用并行來獲得更好的性能并構建可擴展的應用程序,這點都將一直存在。
《.NET并發編程實戰》將描述我運用函數式編程使用C#和F#編寫.NET并發程序的經驗。我相信函數式編程正在成為編寫并發代碼,協調.NET中的異步和并行程序的實際方式,《.NET并發編程實戰》將為你提供你所需的一切知識,從而讓你做好準備并投身這個令人興奮的多核計算機編程領域。
內容簡介:

圖書內容
● 最重要的并發抽象
● 采用代理編程模型
● 實現實時事件流處理
● 執行無邊界異步操作
● 適用于所有平臺的最佳并發實踐和模式
目錄:

第Ⅰ部分函數式編程在并發程序中所體現的優勢
第1章函數式并發基礎3
1.1你將從本書中學到什么4
1.2讓我們從術語開始5
1.2.1順序編程——一次執行一個任務6
1.2.2并發編程——同時運行多個任務7
1.2.3并行編程——同時執行多個任務8
1.2.4多任務處理——同時在一段時間內執行多個任務9
1.2.5多線程性能調優10
1.3為什么需要并發11
1.4并發編程的陷阱14
1.4.1并發的危害14
1.4.2共享狀態的演變17
1.4.3一個簡單的真實示例:并行快速排序17
1.4.4F#中的基準測試21
1.5為什么選擇函數式編程實現并發21
1.6擁抱函數式范式24
1.7為什么選擇F#和C#進行函數式并發編程25
1.8本章小結27
第2章并發函數式編程技術29
2.1使用函數組合解決復雜的問題30
2.1.1C#的函數組合30
2.1.2F#的函數組合32
2.2閉包簡化函數式思考33
2.2.1使用lambda表達式捕獲閉包中的變量34
2.2.2多線程環境中的閉包36
2.3用于程序加速的記憶化緩存技術38
2.4記憶快速網絡爬蟲的操作42
2.5延遲記憶化以獲得更好的性能46
2.6有效率的并行推測以攤銷昂貴計算成本47
2.6.1具有天然函數支持的預計算50
2.6.2使最佳計算獲勝51
2.7延遲是件好事情52
2.7.1對嚴格求值語言并發行為的理解52
2.7.2延遲緩存技術和線程安全的單例模式54
2.7.3F#中的延遲支持55
2.7.4延遲和任務,一個強大的組合55
2.8本章小結57
第3章函數式數據結構和不可變性59
3.1真實世界的例子:捕獵線程不安全的對象60
3.1.1.NET不可變集合:一種安全的解決方案63
3.1.2.NET并發集合:更快的解決方案67
3.1.3代理消息傳遞模式:更快、更好的解決方案69
3.2在線程之間安全地共享函數式數據結構72
3.3修改的不可變性73
3.3.1數據并行的函數式數據結構75
3.3.2使用不可變性的性能影響75
3.3.3C#的不可變性76
3.3.4F#的不可變性79
3.3.5函數式列表:連接一條鏈中的單元格80
3.3.6構建可持久化數據結構:不可變二叉樹86
3.4遞歸函數:一種自然的迭代方式89
3.4.1正確遞歸函數尾部:尾部調用優化90
3.4.2延續傳遞風格以優化遞歸函數91
3.5本章小結95

第Ⅱ部分如何處理并發程序的不同部分
第4章處理大數據的基礎:數據并行,第1部分99
4.1什么是數據并行100
4.1.1數據和任務并行101
4.1.2“尷尬并行”概念102
4.1.3.NET中的數據并行支持102
4.2Fork/Join模式:并行Mandelbrot103
4.2.1當GC是瓶頸時:結構與類對象109
4.2.2并行循環的缺點111
4.3測量性能速度111
4.3.1Amdahl定律定義了性能改進的極限112
4.3.2Gustafson定律:進一步衡量性能改進113
4.3.3并行循環的局限性:素數之和113
4.3.4簡單循環可能會出現什么問題115
4.3.5聲明式并行編程模型117
4.4本章小結118
第5章PLINQ和MapReduce:數據并行,第2部分121
5.1PLINQ簡介122
5.1.1PLINQ如何更具函數式123
5.1.2PLINQ和純函數:并行字計數器123
5.1.3使用純函數避免副作用125
5.1.4隔離和控制副作用:重構并行字計數器127
5.2并行聚合和歸約數據128
5.2.1擇伐(Deforesting):折疊的諸多優點之一130
5.2.2PLINQ中的fold:Aggregate函數131
5.2.3為PLINQ實現并行Reduce函數137
5.2.4F#的并行列表解析:PSeq139
5.2.5F#的并行數組140
5.3并行MapReduce模式142
5.3.1Map和Reduce函數143
5.3.2在NuGet包庫中使用MapReduce144
5.4本章小結149
第6章實時事件流:函數式反應式編程151
6.1反應式編程:大事件處理152
6.2用于反應式編程的.NET工具155
6.2.1事件組合器——更好的解決方案156
6.2.2.NET與F#組合器的互操作性157
6.3.NET中的反應式編程:反應式擴展(Rx)160
6.3.1從LINQ/PLINQ到Rx162
6.3.2IObservable:對偶IEnumerable163
6.3.3Action中的反應式擴展164
6.3.4Rx實時流165
6.3.5從事件到F#Observable166
6.4馴服事件流:使用Rx編程進行Twitter情緒分析167
6.5Rx發布者-訂閱者176
6.5.1為強大的發布者-訂閱者集線器使用Subject類型176
6.5.2與并發相關的Rx177
6.5.3實現可重用的Rx發布者-訂閱者178
6.5.4使用RxPub-Sub類分析推文情緒180
6.5.5action中的觀察者183
6.5.6方便的F#對象表達式184
6.6本章小結184
第7章基于任務的函數式并行187
7.1任務并行的簡短介紹188
7.1.1為什么要進行任務并行和函數式編程189
7.1.2.NET中的任務并行化支持189
7.2.NET任務并行庫191
7.3C#void的問題196
7.4延續傳遞風格(CPS):函數式控制流程198
7.4.1為什么要利用CPS199
7.4.2等待任務完成:延續模型200
7.5組合任務操作的策略205
7.5.1使用數學模式以獲得更好的組合207
7.5.2任務使用準則212
7.6并行函數式管道模式212
7.7本章小結218
第8章最終勝出的任務異步模型219
8.1異步編程模型(APM)220
8.1.1異步編程的價值220
8.1.2可擴展性和異步編程223
8.1.3CPU密集型和I/O密集型操作223
8.2異步編程不受限制的并行度224
8.3.NET的異步支持225
8.3.1異步編程會破壞代碼結構228
8.3.2基于事件的異步編程228
8.4C#基于任務的異步編程229
8.4.1匿名異步lambda232
8.4.2Task<T>是一個monadic容器232
8.5基于任務的異步編程:案例研究235
8.5.1異步取消240
8.5.2帶有monadicBind運算符的基于任務的異步組合244
8.5.3延遲異步計算以實現組合245
8.5.4如果出現問題,請重試246
8.5.5異步操作的錯誤處理247
8.5.6股票市場歷史的異步并行處理249
8.5.7任務完成后的異步股票市場并行處理251
8.6本章小結252
第9章F#的異步函數編程253
9.1異步函數式方面254
9.2什么是F#異步工作流254
9.2.1計算表達式中的延續傳遞風格254
9.2.2異步工作流操作:AzureBlob存儲并行操作257
9.3異步計算表達式261
9.3.1計算表達式和單子之間的區別263
9.3.2異步重試:生成自己的計算表達式264
9.3.3擴展異步工作流266
9.3.4映射異步操作:Async.map函子267
9.3.5并行化異步工作流:Async.Parallel269
9.3.6異步工作流取消支持274
9.3.7馴服并行異步操作276
9.4本章小結280
第10章用于流暢式并發編程的函數式組合器281
10.1執行流并不總是處于正常情況:錯誤處理282
10.2錯誤組合器:C#中的Retry、Otherwise和Task.Catch285
10.2.1FP中的錯誤處理:流控制的異常289
10.2.2在C#中使用Task<Option<T>>處理錯誤291
10.2.3F#AsyncOption類型:組合Async和Option291
10.2.4F#慣用的函數式異步錯誤處理292
10.2.5使用Result類型保留異常語義294
10.3在異步操作中控制異常298
10.3.1F#使用Async和Result建模錯誤處理302
10.3.2使用monadic運算符bind擴展F#AsyncResult類型304
10.4使用函數式組合器抽象化操作308
10.5函數式組合器概要309
10.5.1TPL內置異步組合器310
10.5.2利用Task.WhenAny組合器實現冗余和交叉311
10.5.3使用Task.WhenAll組合器進行異步for-each312
10.5.4回顧迄今看到的數學模式314
10.6最終的并行組合應用函子317
10.6.1使用應用函子運算符擴展F#異步工作流324
10.6.2帶有中綴運算符的F#應用函子語義326
10.6.3利用應用函子實現異構并行計算326
10.6.4組合和執行異構并行計算328
10.6.5使用條件異步組合器控制流330
10.6.6運用異步組合器334
10.7本章小結336
第11章使用代理應用反應式編程339
11.1什么是反應式編程340
11.2異步消息傳遞編程模型342
11.2.1消息傳遞和不可變性的關系344
11.2.2天然隔離344
11.3代理是什么345
11.3.1代理的組件346
11.3.2代理可以做什么347
11.3.3無鎖并發編程的無共享方法347
11.3.4基于代理的編程如何體現函數式思想348
11.3.5代理是面向對象的349
11.4F#代理:MailboxProcessor349
11.5使用F#MailboxProcessor避免數據庫瓶頸352
11.5.1MailboxProcessor消息類型:可區分聯合355
11.5.2MailboxProcessor雙向通信356
11.5.3在C#中使用AgentSQL357
11.5.4成組協調代理來并行工作流358
11.5.5如何使用F#MailboxProcessor處理錯誤360
11.5.6停止MailboxProcessor代理——CancellationToken361
11.5.7使用MailboxProcessor分發工作362
11.5.8使用代理緩存操作364
11.5.9由MailboxProcessor報告結果368
11.5.10使用線程池報告來自MailboxProcessor的事件371
11.6F#MailboxProcessor:10000個代理的生命游戲371
11.7本章小結376
第12章使用TPLDataflow的并行工作流與代理編程379
12.1TPLDataflow的強大性380
12.2組合式設計:TPLDataflow塊381
12.2.1使用BufferBlock<TInput>作為FIFO緩沖區382
12.2.2使用TransformBlock<TInput,TOutput>轉換數據383
12.2.3使用ActionBlock<TInput>完成工作384
12.2.4連接數據流塊385
12.3使用TDF實現復雜的生產者/消費者386
12.3.1多生產者/單消費者模式386
12.3.2單生產者/多消費者模式387
12.4使用TPLDataflow在C#中啟用代理模型388
12.4.1代理折疊狀態和消息:聚合392
12.4.2代理交互:并行單詞計數器392
12.5壓縮和加密大型流的并行工作流397
12.5.1上下文:處理大型數據流的問題397
12.5.2確保消息流的順序完整性402
12.5.3連接、傳播和完成403
12.5.4構建TDF工作流的規則405
12.5.5組合ReactiveExtensions(Rx)和TDF406
12.6本章小結407
第Ⅲ部分現代并發編程模式應用
第13章成功的并發編程的配方和設計模式411
13.1循環利用對象以減少內存消耗412
13.2自定義并行Fork/Join運算符415
13.3并行具有依賴關系的任務:設計代碼以優化性能418
13.4用于協調并發I/O操作共享資源的閘門:一次寫入,多次讀取423
13.5線程安全的隨機數生成器430
13.6多態事件聚合器432
13.7自定義Rx調度程序來控制并行度435
13.8并發的反應式可擴展客戶端/服務器438
13.9可復用的自定義高性能并行filter-map運算符448
13.10無阻塞同步消息傳遞模型452
13.11使用代理編程模型協調并發作業457
13.12組合monadic函數462
13.13本章小結465
第14章使用并發函數式編程構建可擴展的移動應用程序467
14.1現實世界服務器上的函數式編程468
14.2如何設計一個成功的高性能應用程序469
14.2.1秘制醬:ACD470
14.2.2不同的異步模式:將工作排隊以稍后執行470
14.3選擇正確的并發編程模型472
14.4實時交易:股票市場示例的高層架構475
14.5股票市場應用程序的基本要素479
14.6編寫股票市場交易應用程序479
14.7本章小結501
附錄A函數式編程503
附錄BF#概述517
附錄CF#異步工作流和.NETTask之間的互操作性535
序: