我需要在交互式應用程序中管理CPU繁重的多任務作業。正如背景一樣,我的具體應用是工程設計界面。當用戶調整模型的不同參數和選項時,多個模擬會在後臺運行,並在結束時顯示結果,甚至可能在用戶仍在編輯值時發生。由於多個模擬需要可變時間(有些是毫秒,有些需要5秒,有些需要10分鐘),但基本上是儘可能快地獲得反饋,但通常會中止以前開始但現在不再需要的作業,因爲用戶的更改已使其失效。不同的用戶更改可能會使不同的計算失效,因此我可能隨時運行10個不同的模擬。有些模擬有多個部分有相關性(模擬A和B可以單獨計算,但我需要他們的結果來種子模擬C,因此我需要等待A和B在開始C之前先完成)。多線程作業隊列管理器
我覺得非常確信處理這種應用程序的代碼級方法是某種多線程作業隊列。這包括提交執行作業,設置任務優先級,等待作業完成,指定依賴關係(完成此作業,但僅在作業X和作業Y完成後),取消符合某些標準的作業子集,查詢什麼內容工作依然存在,設置工作者線程數和優先級等等。多平臺支持也非常有用。
這些並不是新的想法或軟件的願望,但我在我的應用程序的早期設計階段,我需要選擇哪些庫用於管理這些任務。我過去曾在C寫過自己的粗線程經理(我認爲這是一段經文),但我想用現代工具來開展工作,而不是我以前的黑客。
第一個想法是運行到OpenMP,但我不確定這是我想要的。 OpenMP非常適合在良好的級別進行並行處理,自動展開循環等。在多平臺的同時,它也通過#pragmas侵入你的代碼。但大多數情況下,它不是爲管理大型任務而設計的,特別是取消掛起的作業或指定依賴關係。可能的,是的,但它並不優雅。
我注意到Google Chrome uses such a job manager for even the most trivial tasks.設計目標似乎是讓用戶交互線程儘可能輕便靈活,所以任何可以異步生成的東西都應該是這樣。從查看Chrome源代碼看,這似乎不是一個通用庫,但看到設計如何使用異步啓動來保持快速交互仍然很有趣。這與我正在做的事情類似。
還有一個另外的選擇:
Surge.Act:定義工作升壓樣庫。它建立在OpenMP之上,但確實允許鏈接依賴關係,這很好。看起來似乎沒有一個經理可以被查詢,工作被取消等。這是一個過時的項目,所以它依賴它是可怕的。
Job Queue非常接近我的想法,但它是一個5年的文章,而不是一個支持的庫。
Boost.threads確實有很好的平臺獨立同步,但這不是一個工作管理器。 POCO具有非常乾淨的任務啓動設計,但又不是完整的經理鏈接任務。 (也許我低估了POCO)。
所以雖然有可用的選項,我不滿意,我覺得再次推出自己的圖書館的衝動。但我寧願使用已經存在的東西。即使在搜索過程中(在SO和網上),我還沒有發現任何感覺正確的東西,但我想這應該是一種經常需要的工具,所以肯定有一些社區庫或至少是常見的設計。 在SO有posts約job queues,但似乎不適合。
我在這裏的帖子是問你所有我已經錯過的工具,和/或你如何推出自己的這種多線程作業隊列。
優秀。 boost :: future看起來與POCO的ActiveResults非常相似(http://pocoproject.org/poco/docs/Poco.ActiveResult.html)。再說,這不是一個工作隊列管理員,但仍然是一個很棒的工具。 Boost:線程的基礎確實感覺像是製作自定義管理器的最佳低級工具包。 – 2009-02-20 01:23:54