簡體   English   中英

C ++上下文中的執行程序模式是什么?

[英]What is the executor pattern in a C++ context?

asio的作者Christopher Kohlhoff正在為C ++中的執行者提供庫和提議。 到目前為止,他的工作包括這些回購文檔 不幸的是,理由部分還沒有寫出來。 到目前為止,文檔提供了一些圖書館的例子,但我不覺得我錯過了什么。 不知何故,這不僅僅是一系列花哨的調用函數。

我在Google上可以找到的所有東西都是特定於Java的,並且很多特定於特定框架,因此我無法弄清楚這個“執行器模式”是什么。

在這種情況下,執行者是什么? 他們在做什么? 什么時候它們有用的規范示例是什么? 執行人之間存在哪些差異? 執行者有哪些替代方案,他們如何比較? 特別是,事件循環似乎與事件是初始輸入事件,執行事件和關閉事件有很多重疊。

在試圖找出新的抽象時,我通常會發現理解動機的關鍵。 那么對於執行者來說,我們想要抽象的是什么?為什么? 我們試圖制作通用的是什么? 沒有遺囑執行人,我們還需要做多少工作?

執行者最基本的好處是將程序的並行性定義與其使用方式分開。 存在Java的執行程序模型,因為大體上,當您第一次編寫代碼時,您實際上並不知道哪種並行模型最適合您的場景。 您可能幾乎沒有從並行性中獲益,並且根本不應該使用線程,您可能最好使用每個核心的長時間運行的專用工作線程,或者基於當前負載的動態擴展線程池,在它們之后清理線程已經閑置一段時間以減少內存使用,上下文切換等,或者可能只是按需啟動每個任務的線程,在任務完成時退出。

這里的關鍵是,當你第一次編寫代碼時,幾乎不可能知道哪種方法最好。 您可能知道並行性可能對您有所幫助,但在傳統的線程中,您最終會使用並行性(確定使用哪些參數調用哪些函數)來混合並行性“配置”(何時以及是否創建線程)。 當你混合使用這樣的代碼時,對不同選項進行性能測試是一件很大的痛苦,因為每個線程的啟動都是獨立的,必須單獨更新。

執行程序模型的主要好處是並行配置在一個地方(創建執行程序的地方)完成,並且執行程序的用戶不必知道任何有關它的信息。 他們只是向執行者提交工作,接收未來,稍后,從未來檢索結果(必要時阻止)。 如果要試驗其他配置,可以更改定義執行程序的一行並再次運行代碼。 即使您決定需要對代碼的不同部分使用不同的並行模型,與手動重寫每個站點的線程詳細信息相比,重構以添加第二個執行程序並更改第一個執行程序的某些用戶以使用第二個執行程序; 只要執行者的名稱(相對)唯一,找到用戶並將其更改為使用不同的用戶就非常容易了。 執行程序既簡化了代碼(通過避免將線程創建/管理與線程執行的任務混合在一起),並簡化了性能測試。

作為一個附帶好處,您還抽象出將數據傳入和傳出工作線程的復雜性(submit方法封裝前者,future的result方法封裝后者)。 std::async可以獲得一些好處,但是沒有真正控制所涉及的並行性(只是是/否/可能選擇是否強制線程,強制在當前線程中延遲執行,或者讓編譯器/庫決定是否對線程池是否使用進行細粒度控制,如果是,則表示其行為方式)。 真正的執行程序框架為您提供了std::async無法提供的控件,具有類似的易用性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM