我有一些数据需要处理.数据是一棵树.处理过程如下:取一个 node N.判断其所有子 node 是否都已处理.如果没有,请先处理.如果是,则处理N.因此,我们从上到下(递归地)处理叶,然后处理叶,然后处理叶的父 node ,依此类推,直到我们再次到达根.

我知道如何编写一个在一台计算机上运行的程序,以获取数据(即根 node )并按上述方式进行处理.这是一张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);
    }
}

但是,我如何编写程序,以便将工作分发到一组计算机上(这些计算机都在同一个网络中,或者在某个本地网络中,或者在internet上)?我需要为此做些什么?

一些 idea / idea :

  1. DataManager应该在一台计算机上运行(主计算机/服务器?);DataHandler应该在所有其他(客户端?)上运行.
  2. DataManager人需要通过某种身份证来了解计算机(那是什么身份证?)这些都是在DataManager年的建设期间设置的.
  3. DataManager必须能够在这些计算机上创建DataHandler的新实例(或者在出现问题时杀死它们).怎样
  4. DataManager必须知道哪些计算机当前有DataHandler的运行实例,哪些没有,这样它就可以决定哪个计算机可以生成下一个DataHandler(或者,如果没有空闲的,等待).

这些不是要求!我不知道这些 idea 是否可行.

在上面的 idea 中,我假设每台计算机只能有一个DataHandler的实例.我知道这不一定如此(因为CPU内核和线程…),但在我的用例中,实际情况可能是这样的:真正的DataManagerDataHandler不是独立的,而是在SolidWorks上下文中运行的.所以为了运行这些代码,我需要一个正在运行的SolidWorks实例.根据我的经验,同一个窗口上有多个SolidWorks实例无法(可靠地)工作.

据我所知,我需要的似乎是一种多计算机操作系统:在一台计算机设置中,点2、3和4通常由操作系统处理.第一点是OS(OS=DataManager生成进程=DataHandlers;OS跟踪数据=ProcessedData,进程报告回来).


我到底想知道什么?

  • 对单词、短语或介绍性文章的提示,使我能够深入探讨这个主题(以便能够实现这一点).可能是语言不可知论者.
  • 适合这种情况的C#库/框架提示.
  • 关于我应该做什么或不应该做什么的提示(典型的初学者问题).可能是语言不可知论者.
  • 指向示例/演示C#项目的链接,例如GitHub上的链接.(如果不是C#,VB也可以.)

推荐答案

你应该仔细阅读微服务和队列.比如拉比.

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

如果你把你的微服务和Docker集成在一起,你可以做一些漂亮的事情.

Csharp相关问答推荐

有没有办法在WPF文本框中添加复制事件的处理程序?

如何在不考虑年份的情况下判断日期时间是否在某个日期范围内?

StackExchange.Redis.RedisServerException:调用ITransaction.ExecuteAsync()时出现错误未知命令取消监视

如何通过属性初始化器强制初始化继承记录内的属性?

如何将DotNet Watch与发布配置和传递给应用程序的参数一起使用?

在C#中,非静态接口方法的抽象和虚拟是冗余的吗?

如何管理Azure认证客户端响应和证书 fingerprint

交替的奇数

如何让两个.NET版本不兼容的项目对话?

匿名类型的AbstractValidator

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

如何阻止可传递依赖项出现在项目中

我可以阻止类型上的Object.ToString()吗?

我想我必须手动使用res1(字符串形式的PowerShell哈希表)

Avalonia MVVM数据模板

MudRadioGroup不切换

如何防止创建的线程超过可用硬件线程数?

如何在列表框中显示UserControl对象?

";如何在C#中基于多个属性有效地对自定义对象列表进行排序?

发出的属性未显示在调试器中