進一步了解並行LINQ

2021-05-21 22:50:41 字數 1065 閱讀 3396

linq(language integrated query)是visual studio 2008中的領軍人物。借助於linq技術,我們可以使用一種類似sql的語法來查詢任何形式的資料。目前為止linq所支援的資料來源有sql server、xml以及記憶體中的資料集合。開發人員也可以使用其提供的擴充套件框架新增更多的資料來源,例如mysql、amazon甚至是google desktop。

一般來講,這類查詢語句的乙個重要特點就是可以並行化執行。雖然有些情況下並行可能會帶來一些問題,但這種情況非常少見。這樣也就水到渠成地引出了plinq這個並行處理的linq類庫。

plinq原名為parallel linq,支援xml和記憶體中的資料集合。執行於遠端伺服器上的查詢語句(例如linq to sql)顯然無法實現這個功能。

將linq語句轉換為plinq語句極為簡單——只需要在查詢語句中from子句所指定的資料來源的最後新增.asparallel()即可。隨後where、orderby和select子句將自動改為呼叫這個並行的linq版本。

據msdn magazine介紹,plinq可以以三種方式執行。第一種是管道處理:乙個執行緒用來讀取資料源,而其他的執行緒則用來處理查詢語句,二者同步進行——雖然這個單一的消費執行緒可能並不那麼容易與多個生產線程同步。不過若是能夠仔細配置好負載平衡的話,仍然會極大地減少記憶體占用。

第二種模式叫做「stop and go」,用於處理結果集需要被一次返回時(例如呼叫tolist、toarray或對結果排序)的情況。在這種模式下,將依次完成各個處理過程,並將結果統一返回給消費執行緒。這個模式在效能上將優於第一種模式,因為它省去了用來保持執行緒同步所花費的開銷。

最後一種方法叫做「inverted enumeration」。該方法並不需要實現收集到所有的輸出,然後在單一的執行緒中處理,而是將最終呼叫的函式通過forall擴充套件傳遞到每個執行緒中。 這是目前為止最快的一種處理模式,不過這需要傳遞到forall中的函式是執行緒安全的,且最好不包含任何lock之類的互斥語句。

若是plinq中任意的乙個執行緒丟擲異常,那麼所有的其他執行緒將會被終止。若是丟擲了多個異常,那麼這些異常將被組合成乙個multiplefailure***ception型別的異常,但每個異常的呼叫堆疊仍會被保留。

進一步了解Makefile

mkdir p add src 一層一層建立目錄。touch add makefile 建立 makefile include 目錄中存放標頭檔案。scripts 存放指令碼檔案。存放方式 按照核心管理原始碼來管理。為什麼學習makefile?編譯大型專案 讀懂別人的開源 找到程式入口 看專案的順序...

進一步了解Spring Cloud

spring cloud是 系列框架的有序集合。它利 spring boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現註冊 配置中 訊息匯流排 負載均衡 斷路器 資料監控等,都可以 spring boot的開發 格做到 鍵啟動和部署。spring cloud並沒有重複製造輪 它只是...

進一步了解pip

在python中,安裝第三方模組,是通過包管理工具pip完成的。當我們試圖載入乙個模組時,python會在指定的路徑下搜尋對應的.py檔案,如果找不到,就會報錯。預設情況下,python直譯器會搜尋當前目錄 所有已安裝的內建模組和第三方模組,搜尋路徑存放在sys模組的path變數中 import s...