![](/img/trans.png)
[英]How to distribute work equally among workers by total count and total value?
[英]How to distribute work to a pool of computers
我有一些數據需要處理。 數據是一棵樹。 處理過程如下:取一個節點 N。檢查它的所有子節點是否都已處理。 如果沒有,請先處理它們。 如果是,處理N。所以我們go從上到下(遞歸)到葉子,然后處理葉子,然后是葉子的父節點等等,直到我們再次到達根。
我知道如何編寫一個在一台計算機上運行的程序,該程序獲取數據(即根節點)並如上所述進行處理。 這是 C# 中的草圖:
// We assume data is already there, so I do not provide constructor/setters.
public class Data
{
public object OwnData { get; }
public IList<Data> Children { get; }
}
// The main class. We just need to call Process once and wait for it to finish.
public class DataManager
{
internal ISet<Data> ProcessedData { get; init; }
public DataManager()
{
ProcessedData = new HashSet<Data>();
}
public void Process(Data rootData)
{
new DataHandler(this).Process(rootData);
}
}
// The handler class that processes data recursively by spawning new instances.
// It informs the manager about data processed.
internal class DataHandler
{
private readonly DataManager Manager;
internal DataHandler(ProcessManager manager)
{
Manager = manager;
}
internal void Process(Data data)
{
if (Manager.ProcessedData.Contains(data))
return;
foreach (var subData in data.Children)
new DataHandler(Manager).Process(subData);
... // do some processing of OwnData
Manager.ProcessedData.Add(data);
}
}
但是我如何編寫程序才能將工作分配給一組計算機(它們都在同一個網絡中,本地計算機或 inte.net)? 我需要為此做什么?
一些想法/想法:
DataManager
應該在一台計算機上運行(主計算機/服務器?); DataHandlers 應該在所有其他(客戶端?)上運行。DataManager
需要通過在構造DataManager
期間設置的一些 id(那是什么 id?)來了解計算機。DataManager
必須能夠在這些計算機上創建DataHandler
的新實例(或者在出現問題時終止它們)。 如何?DataManager
必須知道哪些計算機當前有正在運行的DataHandler
實例,哪些沒有,以便它可以決定在哪台計算機上生成下一個DataHandler
(或者,如果沒有可用的,則等待)。這些不是要求。 我不知道這些想法是否可行。
在上面的想法中,我假設每台計算機只能有一個DataHandler
實例。 我知道不一定如此(因為 CPU 核心和線程......),但在我的用例中它實際上可能是這樣的:真正的DataManager
和DataHandler
不是獨立的,而是在 SolidWorks 上下文中運行。 因此,為了運行任何這些代碼,我需要有一個正在運行的 SolidWorks 實例。 根據我的經驗,同一 Windows 上的多個 SolidWorks 實例無法(可靠地)工作。
從我一知半解看來,我需要的是一種多計算機操作系統:在單計算機設置中,操作系統通常會處理第 2、3 和 4 點。 第一種是操作系統(操作系統= DataManager
產生進程= DataHandlers
;操作系統跟蹤數據= ProcessedData
並且進程報告回來)。
我到底想知道什么?
您應該閱讀微服務和隊列。 像 rabbitmq。生產者/消費者方法。
https://www.rabbitmq.com/getstarted.html
如果您將微服務與 Docker 集成,您可以做一些非常漂亮的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.