簡體   English   中英

如何將工作分配給一組計算機

[英]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)? 我需要為此做什么?

一些想法/想法:

  1. DataManager應該在一台計算機上運行(主計算機/服務器?); DataHandlers 應該在所有其他(客戶端?)上運行。
  2. DataManager需要通過在構造DataManager期間設置的一些 id(那是什么 id?)來了解計算機。
  3. DataManager必須能夠在這些計算機上創建DataHandler的新實例(或者在出現問題時終止它們)。 如何?
  4. DataManager必須知道哪些計算機當前有正在運行的DataHandler實例,哪些沒有,以便它可以決定在哪台計算機上生成下一個DataHandler (或者,如果沒有可用的,則等待)。

這些不是要求。 我不知道這些想法是否可行。

在上面的想法中,我假設每台計算機只能有一個DataHandler實例。 我知道不一定如此(因為 CPU 核心和線程......),但在我的用例中它實際上可能是這樣的:真正的DataManagerDataHandler不是獨立的,而是在 SolidWorks 上下文中運行。 因此,為了運行任何這些代碼,我需要有一個正在運行的 SolidWorks 實例。 根據我的經驗,同一 Windows 上的多個 SolidWorks 實例無法(可靠地)工作。

從我一知半解看來,我需要的是一種多計算機操作系統:在單計算機設置中,操作系統通常會處理第 2、3 和 4 點。 第一種是操作系統(操作系統= DataManager產生進程= DataHandlers ;操作系統跟蹤數據= ProcessedData並且進程報告回來)。


我到底想知道什么?

  • 對單詞、短語或介紹性文章的提示,使我能夠深入探討該主題(以便能夠實現這一點)。 可能是 language-agnostic。
  • 提示 C# 適合這種情況的庫/框架。
  • 關於我應該做什么或不應該做什么的提示(典型的初學者問題)。 可能是 language-agnostic。
  • 示例/演示 C# 項目的鏈接,例如 GitHub。(如果不是 C#,VB 也可以。)

您應該閱讀微服務和隊列。 像 rabbitmq。生產者/消費者方法。

https://www.rabbitmq.com/getstarted.html

如果您將微服務與 Docker 集成,您可以做一些非常漂亮的事情。

暫無
暫無

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

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